在 javafx 中跟踪节点的路径

Tracing a node's path in javafx

我正在用 javafx 进行双摆模拟。我想用一条清晰的线来追踪下摆的路径,而不是一点点(我已经做到了)。我是 javafx 的新手。我没有使用任何过渡来为其设置动画。我已经使用时间轴和关键帧来使其工作。

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 中的编码实践有点薄弱。我只是在寻找一个小的解决方案来实现,以便我可以快速将它添加到我的模拟器中。提前致谢:)

只需从旧坐标到新坐标添加一条线:

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 节点并将它们添加到场景中。因此,如果模拟 运行s 的时间足够长,您最终会 运行 内存不足。如果模拟预计 运行 一段时间,您可能想限制这些在内存中保留的数量(例如,停止在某个固定数字后添加新行,或者通过删除较早的数字来保持最大数量一旦达到限制,等等)。