Могу ли я сделать радиусы JavaFx ArcTo независимыми от родительских координат x и y? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть JavaFx ArcTo, который соединяет две вершины. Намерение состоит в том, чтобы нарисовать ориентированные ребра на графе, где две вершины могут иметь общие направленные в противоположные стороны ребра. Ar c предназначен для того, чтобы избежать перекрытия и чтобы оба края были видны. Установить радиус x и y достаточно просто, но я хочу, чтобы ar c оставался визуально согласованным, независимо от того, какая ориентация ar c находится внутри родительского узла, которым в данном случае является AnchorPane. У меня есть доступ к позициям (x, y) обеих вершин.

Мне нужно, чтобы ar c имел такой же вид сплющенный независимо от его ориентации. Я также открыт для решений, не связанных с arcTo.

Вот изображение желаемого поведения. Спасибо за любую помощь! :) enter image description here

1 Ответ

0 голосов
/ 28 мая 2020

Чтобы сохранить отношение расстояния от самой дальней точки на арке c к линии, соединяющей его концы, к расстоянию между концами одинаковым, просто масштабируйте радиусы линейно с расстоянием между концами. Следующий код позволяет перемещать одну из конечных точек, щелкая по сцене. Однако не требуется c логики, кроме обновления конечных точек, чтобы приспособиться к измененной ориентации; Единственное существенное изменение - это изменение расстояния.

@Override
public void start(Stage primaryStage) throws Exception {
    ArcTo arc1 = new ArcTo();
    arc1.setLargeArcFlag(false);

    ArcTo arc2 = new ArcTo();
    arc2.setLargeArcFlag(false);

    Path path = new Path(new MoveTo(400, 400), arc1, arc2);
    path.setFill(null);
    path.setStroke(Color.BLACK);

    Pane root = new Pane(path);
    root.setOnMouseClicked(evt -> updateArcs(arc1, arc2, 400, 400, evt.getX(), evt.getY()));
    Scene scene = new Scene(root, 800, 800);

    updateArcs(arc1, arc2, 400, 400, 600, 200);

    primaryStage.setScene(scene);
    primaryStage.show();
}

private static void updateArcs(ArcTo arc1, ArcTo arc2, double startX, double startY, double endX, double endY) {
    final double factor = 0.8;

    arc1.setX(endX);
    arc1.setY(endY);

    arc2.setX(startX);
    arc2.setY(startY);

    double radius = factor * Math.hypot(endX - startX, endY - startY);
    arc1.setRadiusX(radius);
    arc1.setRadiusY(radius);

    arc2.setRadiusX(radius);
    arc2.setRadiusY(radius);
}
...