JavaFX-如何计算路径对象的中心?

JavaFX-如何计算路径对象的中心?,java,javafx,path,shapes,Java,Javafx,Path,Shapes,我有一个由 所有5个对象都以相同的样式绘制。-(移动到、行到、弧到、行到、弧到) 我需要一种可以计算整个路径对象中心的方法 他们可以为所有五个物体计算它 其思想是计算两条弧的中心(arcTo),创建一条连接这些中心的线,该线的中心将是整个路径对象的中心 但是,我不知道如何简单地计算它。我陷入了圆弧中心的计算中 我需要独立于对象创建来计算它,但我可以访问对象-我可以获得关于它们的所有信息。有更好的方法来做到这一点(通过适当地应用正确的数学方程)。但是,您可以操纵路径转换系统以获得所需的答案,如以

我有一个由

所有5个对象都以相同的样式绘制。-(移动到、行到、弧到、行到、弧到)

我需要一种可以计算整个
路径
对象中心的方法

他们可以为所有五个物体计算它

其思想是计算两条弧的中心(
arcTo
),创建一条连接这些中心的
线,该
线的中心将是整个
路径
对象的中心

但是,我不知道如何简单地计算它。我陷入了圆弧中心的计算中


我需要独立于对象创建来计算它,但我可以访问对象-我可以获得关于它们的所有信息。

有更好的方法来做到这一点(通过适当地应用正确的数学方程)。但是,您可以操纵路径转换系统以获得所需的答案,如以下答案中所述:

绿色点是圆弧的中点。 红色点是路径中心的中点

根据定义(据我理解):


根据描述,他试图定位两个路径元素(arcTo元素)的中心。我假设路径元素的中心点是沿圆弧等距的点。然后,他将计算这两个路径元素中心点之间的假想线的中点。这条线的中点是尤达定义的路径中心(这是他最终试图计算的)


我完全没有声称上述建议的解决方案在其计算值上实际上是100%正确的,但是,从一个偶然的角度看,它看起来是正确的(或足够接近),在大多数情况下,它对我来说似乎是合适的。

您能提供一个详细的说明吗。您是如何生成要输入到此文件的初始路径元素的?您想要整个路径的中心,还是每个路径元素的中心(moveTo除外)?根据描述,他正在尝试定位两个路径元素(arcTo元素)的中心。我假设路径元素的中心点是沿圆弧等距的点。然后,他将计算这两个路径元素中心点之间的假想线的中点。这条线的中点是尤达定义的路径中心(这是他最终试图计算的)。是的,当我创建一条连接两个
弧到
中心的
线时,这条
线的中心是整个
路径的中心。中心
线
很容易计算,但
ArcTo
的中心更复杂-我找到了一个如何计算中心的方法,但我不理解它。我不会在这里为绘制
Path
编写代码。1.这太复杂了。2.我想独立于
路径
对象的创建来计算中心。3.我可以访问对象,以便获得它们包含的所有信息。我仍然不清楚问题中提出的确切问题,但使用路径转换来找到任意路径的中点是一个聪明的想法。是的。我花了一段时间来理解代码,并将其应用到我的程序中,它工作正常。非常感谢你。
import javafx.animation.Interpolator;
import javafx.animation.PathTransition;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.stage.Stage;
import javafx.util.Duration;

public class ArcCenter extends Application {
    @Override
    public void start(Stage stage) {
        Path arcPath1 = new Path(
                new MoveTo(50, 25),
                new ArcTo(30, 15, 0, 100, 50, false, true)
        );
        arcPath1.setStrokeWidth(2);
        arcPath1.setStroke(Color.ORANGE);

        Path arcPath2 = new Path(
                new MoveTo(30, 40),
                new ArcTo(10, 5, 0, 60, 60, false, true)
        );
        arcPath2.setStrokeWidth(2);
        arcPath2.setStroke(Color.HOTPINK);

        Circle arcMidpoint1 = calcMidpoint(arcPath1, Color.FORESTGREEN);
        Circle arcMidpoint2 = calcMidpoint(arcPath2, Color.FORESTGREEN);

        Group group = new Group(
                arcPath1,
                arcPath2,
                arcMidpoint1,
                arcMidpoint2
        );

        arcMidpoint2.translateYProperty().addListener((observable, oldValue, newValue) -> {
            Path line = new Path(
                    new MoveTo(arcMidpoint1.getTranslateX(), arcMidpoint1.getTranslateY()),
                    new LineTo(arcMidpoint2.getTranslateX(), arcMidpoint2.getTranslateY())
            );
            line.setStroke(Color.LIGHTBLUE);
            line.setStrokeWidth(2);
            group.getChildren().add(line);
            line.toBack();

            Circle lineMidpoint = calcMidpoint(line, Color.RED.darker());
            lineMidpoint.translateYProperty().addListener((o, old, newV) -> {
                System.out.println(
                    "Path center point: ( " +
                    lineMidpoint.getTranslateX() + ", " +
                    lineMidpoint.getTranslateY() + " )"
                );
            });
            group.getChildren().add(lineMidpoint);
        });

        group.setScaleX(2);
        group.setScaleY(2);

        stage.setScene(
                new Scene(
                        new StackPane(new Group(group)),
                        300, 200,
                        Color.rgb(35, 39, 50)
                )
        );
        stage.show();
    }

    private Circle calcMidpoint(Path path, Color midpointColor) {
        Circle midpoint = new Circle(3, midpointColor);

        PathTransition pathTransition = new PathTransition(Duration.minutes(10), path, midpoint);
        pathTransition.setOrientation(PathTransition.OrientationType.NONE);
        pathTransition.setInterpolator(Interpolator.LINEAR);
        pathTransition.jumpTo(pathTransition.getDuration().divide(2));
        pathTransition.play();

        midpoint.translateYProperty().addListener((observable, oldValue, newValue) -> {
            pathTransition.stop();
        });

        return midpoint;
    }

    public static void main(String[] args) {
        launch(args);
    }
}