docs: private void rotateNeedle(double value) {
          double startOffsetAngle = 180 - startAngle;
          double targetAngle;
          if (NeedleBehavior.STANDARD == needleBehavior) {
              if (ScaleDirection.CLOCKWISE == gauge.getScaleDirection()) {
                  targetAngle = startOffsetAngle + (value - minValue) * angleStep;
                  targetAngle = Helper.clamp(startOffsetAngle, startOffsetAngle + angleRange, targetAngle);
              } else {
                  targetAngle = startOffsetAngle - (value - minValue) * angleStep;
                  targetAngle = Helper.clamp(startOffsetAngle - angleRange, startOffsetAngle, targetAngle);
              }
          } else {
              if (value < minValue) value = maxValue - minValue + value;
              if (value > maxValue) value = value - maxValue + minValue;
              if (ScaleDirection.CLOCKWISE == gauge.getScaleDirection()) {
                  targetAngle = startOffsetAngle + (value - minValue) * angleStep;
                  targetAngle = Helper.clamp(startOffsetAngle, startOffsetAngle + angleRange, targetAngle);
              } else {
                  targetAngle = startOffsetAngle - (value - minValue) * angleStep;
                  targetAngle = Helper.clamp(startOffsetAngle - angleRange, startOffsetAngle, targetAngle);
              }
          }
  
          needleRotate.setAngle(targetAngle);
          valueText.setText(formatNumber(gauge.getLocale(), gauge.getFormatString(), gauge.getDecimals(), value));
          if (gauge.isLcdVisible()) {
              valueText.setTranslateX((0.691 * size - valueText.getLayoutBounds().getWidth()));
          } else {
              valueText.setTranslateX((size - valueText.getLayoutBounds().getWidth()) * 0.5);
          }
  
          if (gauge.isAverageVisible()) drawAverage();
      }