我可以使JavaFx ArcTo的半径独立于父级的x和y坐标吗?

问题描述 投票:-1回答:1

我有一个JavaFx ArcTo,它连接两个顶点。目的是在图形上绘制有向边,其中两个顶点可以共享相对的有向边。弧线应避免重叠,并确保两个边缘均可见。设置x和y的半径很容易,但是我希望弧线在视觉上保持一致,无论弧线的方向在父节点内如何(在本例中为AnchorPane)。我可以访问两个顶点的(x,y)位置。

我需要弧线具有相同的flattened外观,无论其方向如何。我也欢迎不涉及arcTo的解决方案。

这里是所需行为的图像。感谢您的任何帮助! :)enter image description here

java javafx shapes directed-graph
1个回答
0
投票

要使圆弧上最远点与连接端点的线到端点的距离之比保持相同,只需将半径与端点的距离成线性比例即可。以下代码允许您通过单击场景来移动端点之一。 然而,除了更新端点以适应变化的方向之外,没有任何其他逻辑;唯一相关的变化是距离的变化。

@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);
}
© www.soinside.com 2019 - 2024. All rights reserved.