Чтобы сохранить отношение расстояния от самой дальней точки на арке 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);
}