Я создаю график декартовой координаты, используя NumberAxis для создания осей x и y в LineChart, и использую getDisplayPosition, чтобы найти расстояние между двумя точками вдоль оси x и двумя точками вдоль оси y. Различия не равны друг другу .
Я установил верхние / нижние границы осей x и y одинаковыми с той же настройкой tickUnit. Визуально сетка выглядит квадратной и равной со всех сторон, но я не могу сделать их абсолютно равными.
Вот как я устанавливаю NumberAxis для x и y в моей линейной диаграмме:
xAxis.setLowerBound(-2.4);
xAxis.setUpperBound(2.4);
xAxis.setTickUnit(.1);
xAxis.setSide(Side.BOTTOM);
xAxis.setAutoRanging(false);
yAxis.setLowerBound(-2.4);
yAxis.setUpperBound(2.4);
yAxis.setTickUnit(.1);
yAxis.setSide(Side.LEFT);
yAxis.setAutoRanging(false);
LineChart linechart = new LineChart<Number,Number>(xAxis, yAxis);
Вот как я конвертирую входные данные для правильного отображения прямоугольника
private Rectangle calcRectangle(SectionRectangle rectangle){
double xPosition = xAxis.getDisplayPosition(rectangle.getXorigin());
double yPosition = yAxis.getDisplayPosition(rectangle.getYorigin());
double xCoord = xPosition + chartZeroX;//x origin of rectangle
double yCoord = yPosition + chartZeroY;//y origin of rectangle
double width = rectangle.getXorigin() + rectangle.getWidth();
double widthPosition = xAxis.getDisplayPosition(width);
double heightPosition = yAxis.getDisplayPosition(rectangle.getYorigin() + rectangle.getHeight());
Rectangle calculatedRectangle = new Rectangle(xCoord, yCoord - (yPosition - heightPosition), widthPosition - xPosition, yPosition - heightPosition);
calculatedRectangle.setFill(Color.TRANSPARENT);
Rotate rotate = new Rotate();
rotate.setAngle(360 - rectangle.getRotation());
rotate.setPivotX(xPosition + chartZeroX);
rotate.setPivotY(yPosition + chartZeroY);
calculatedRectangle.getTransforms().add(rotate);
calculatedRectangle.setStroke(Color.BLACK);
return calculatedRectangle;
А вот как я добавляю фигуру на график
Pane chartContent = (Pane) linechart.lookup(".chart-content");
Rectangle rectangle = calcRectangle(rectangleData);
chartContent.getChildren().add(rectangle);
Без поворота прямоугольник будет отображаться в масштабе, как и ожидалось, но из-за небольшого отклонения ширины пикселя от высоты пикселя при повороте на 90 градусов прямоугольник измеряется выше, чем он был измерен в ширину.
Вот более точный пример вопроса
double xdiff = xAxis.getDisplayPosition(1) - xAxis.getDisplayPosition(0);
double ydiff = yAxis.getDisplayPosition(0) - yAxis.getDisplayPosition(1);
здесь xdiff = 195,208 и ydiff = 191,041
Надеясь, что ось X и Y сохранят точное равное расстояние.