我可以使 JavaFx ArcTo 的半径独立于父级的 x 和 y 坐标吗?
Can I make a JavaFx ArcTo's radii independent of the parent's x and y coordinates?
我有一个连接两个顶点的 JavaFx ArcTo。目的是在图形上绘制有向边,其中两个顶点可以共享相对的有向边。圆弧是为了避免重叠并确保两个边缘都可见。设置 x 和 y 的半径很容易,但我希望弧在视觉上保持一致,无论弧在父节点内的方向如何,在本例中为 AnchorPane。我可以访问两个顶点的 (x,y) 位置。
我需要圆弧具有相同类型的 扁平化 外观,无论其方向如何。我也愿意接受不涉及 arcTo 的解决方案。
这是所需行为的图片。感谢您的任何帮助! :)
为了保持圆弧上最远点到连接它的端点的线的距离与端点距离的比率相同,只需按端点距离线性缩放半径。以下代码允许您通过单击场景来移动端点之一。 然而,除了更新端点以完全适应改变的方向外,不需要任何逻辑;唯一相关的变化是距离的变化。
@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);
}
我有一个连接两个顶点的 JavaFx ArcTo。目的是在图形上绘制有向边,其中两个顶点可以共享相对的有向边。圆弧是为了避免重叠并确保两个边缘都可见。设置 x 和 y 的半径很容易,但我希望弧在视觉上保持一致,无论弧在父节点内的方向如何,在本例中为 AnchorPane。我可以访问两个顶点的 (x,y) 位置。
我需要圆弧具有相同类型的 扁平化 外观,无论其方向如何。我也愿意接受不涉及 arcTo 的解决方案。
这是所需行为的图片。感谢您的任何帮助! :)
为了保持圆弧上最远点到连接它的端点的线的距离与端点距离的比率相同,只需按端点距离线性缩放半径。以下代码允许您通过单击场景来移动端点之一。 然而,除了更新端点以完全适应改变的方向外,不需要任何逻辑;唯一相关的变化是距离的变化。
@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);
}