在javafx中跟踪节点的路径

时间:2018-04-18 15:15:05

标签: javafx transitions

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

1 个答案:

答案 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节点并将它们添加到场景中。因此,如果模拟运行的时间足够长,那么最终会耗尽内存。如果预计模拟运行一段时间,您可能希望限制内存中保留的这些数量(例如,在某个固定数字后停止添加新行,或者在达到某些固定数字后删除之前的数字,将数字保持为最大值限制等)。