Как сохранить одинаковую длину x и y для NumberAxis в JavaFX LineChart? - PullRequest
0 голосов
/ 12 апреля 2019

Я создаю график декартовой координаты, используя 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 сохранят точное равное расстояние.

1 Ответ

0 голосов
/ 16 апреля 2019

Я решил собственную проблему, контролируя высоту и ширину линейной диаграммы:

linegraph.setPrefHeight(850);
linegraph.setMinHeight(850);
linegraph.setMaxHeight(850);
linegraph.setMinWidth(853);
linegraph.setMaxWidth(853);
linegraph.setPrefWidth(853);
linegraph.setPrefSize(853, 850);
linegraph.setMinSize(853, 850);
linegraph.setMaxSize(853, 850);

Я проверил расстояние между x = 0, x = 1 и y = 0, y = 1, используя:

double xlength = xAxis.getDisplayPosition(1) - xAxis.getDisplayPosition(0);
double ylength = yAxis.getDisplayPosition(0) - yAxis.getDisplayPosition(1);

Я медленно увеличивал свою ширину, пока обе длины не стали равны.

...