我在javafx中进行双摆模拟。我想通过一条清晰的线来追踪下部鲍勃的路径,而不是一点点(我已经实现了)。我是javafx的新手。我没有使用任何过渡来动画它。我使用了Timeline和KeyFrame来使它工作。
private static void doCalc(){
a1_v+=a1_a;
a2_v+=a2_a;
a1+=a1_v;
a2+=a2_v;
a1_a = calcA1();
a2_a = calcA2();
System.out.println(a1_a+"\n"+a2_a+"\n");
x1 = calcX(x0,a1,r1);
y1 = calcY(y0,a1,r1);
x2 = calcX(x1,a2,r2);
y2 = calcY(y1,a2,r2);
Circle tracer = new Circle(x2,y2,1);
tracer.setFill(Color.BLUE);
root.getChildren().add(0,tracer);
}
这是执行计算的方法,并在每次创建新帧时添加跟踪器。但我想用一条线代表我的节点的路径,而不是一串点。 这可能是一个愚蠢的问题,我知道我在javafx中的编码实践有点弱。我只是在寻找一个小的解决方案来实现,这样我就可以快速将它添加到我的模拟器中。在此先感谢:)
答案 0 :(得分:0)
只需在旧坐标中添加一行到新坐标:
private static void doCalc(){
// I think these must be the old coordinates you need:
double oldX2 = x2 ;
double oldY2 = y2 ;
a1_v+=a1_a;
a2_v+=a2_a;
a1+=a1_v;
a2+=a2_v;
a1_a = calcA1();
a2_a = calcA2();
System.out.println(a1_a+"\n"+a2_a+"\n");
x1 = calcX(x0,a1,r1);
y1 = calcY(y0,a1,r1);
x2 = calcX(x1,a2,r2);
y2 = calcY(y1,a2,r2);
Line traceLine = new Line(oldX2, oldY2, x2, y2);
traceLine.setStroke(Color.BLUE);
root.getChildren().add(0,traceLine);
}
你也可以使用Path
并更新它:
// do this once:
Path trace = new Path();
trace.getElements().add(new MoveTo(initialX2, initialY2));
trace.setStroke(Color.BLUE);
root.getChildren().add(trace);
// ...
private static void doCalc(){
a1_v+=a1_a;
a2_v+=a2_a;
a1+=a1_v;
a2+=a2_v;
a1_a = calcA1();
a2_a = calcA2();
System.out.println(a1_a+"\n"+a2_a+"\n");
x1 = calcX(x0,a1,r1);
y1 = calcY(y0,a1,r1);
x2 = calcX(x1,a2,r2);
y2 = calcY(y1,a2,r2);
trace.getElements().add(new LineTo(x2, y2));
}
请注意,这些方法中的任何一种(实际上您使用圆圈的原始方法)都会无限制地创建许多UI节点并将它们添加到场景中。因此,如果模拟运行的时间足够长,那么最终会耗尽内存。如果预计模拟运行一段时间,您可能希望限制内存中保留的这些数量(例如,在某个固定数字后停止添加新行,或者在达到某些固定数字后删除之前的数字,将数字保持为最大值限制等)。