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