我想编写一个在无限动画中在圆上移动的点,并且希望跟踪点的坐标以在动画中从它们画一条线。我已经用给定的radius
创建了一个轨道(基本上是一个没有填充的圆形,只是笔划)。我尝试创建关键帧:
Timeline timeline = new Timeline();
for(; theta < 2*Math.PI; theta += 0.5) {
x = radius*Math.cos(theta);
y = radius*Math.sin(theta);
KeyFrame kf = new KeyFrame(Duration.millis(3000), new KeyValue(point.translateXProperty(), x),
new KeyValue(point.translateYProperty(), y));
timeline.getKeyFrames().add(kf);
}
但是,这没有用,我找不到使用新的x和y坐标的方法。有人有更好的主意吗?
编辑: 这就是我创建轨道的方式
private void createOrbit(BorderPane root) {
Pane pane = new StackPane();
pane.setTranslateX(root.getWidth()/2);
pane.setTranslateY(root.getHeight()/2);
root.getChildren().add(pane);
double radius = 100;
Circle orbit = new Circle(radius, null);
orbit.setStroke(Color.BLACK);
pane.getChildren().add(orbit);
}
现在我想再画一个圆圈:
Circle point = new Circle(x,y,50,Color.BLACK);
其中x = radius * Math.cos(theta)
和y = radius * Math.sin(theta)
,都取决于角度theta
。因此,我想创建一个动画,其中theta
发生变化,并且将点重新绘制在轨道上的其他位置。 (即绕太阳公转的地球)
EDIT2:好的,所以我尝试了 AnimationTimer :
package application;
import javafx.animation.*;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
public class Main extends Application {
double theta = 0;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
BorderPane root = new BorderPane();
Scene scene = new Scene(root, 600, 600);
Group group = new Group();
group.setTranslateX(300);
group.setTranslateY(300);
double radius = 100;
Circle orbit = new Circle(radius, null);
orbit.setStroke(Color.BLACK);
Circle point = new Circle(-radius, 0, 7, Color.BLACK);
AnimationTimer animator = new AnimationTimer() {
@Override
public void handle(long now) {
// UPDATE
theta += 0.055d;
if (theta >= 2 * Math.PI) {
theta = 0;
}
double x = radius * Math.cos(theta);
double y = radius * Math.cos(theta);
// RENDER
point.setCenterX(x);
point.setCenterY(y);
}
};
animator.start();
group.getChildren().addAll(orbit, point);
root.getChildren().add(group);
primaryStage.setScene(scene);
primaryStage.show();
}
}
point
现在更像钟摆一样运动,如何设置(x,y)使其在轨道上运动?
答案 0 :(得分:0)
这是使点在轨道上以圆形模式运动的代码,也可以通过将点声明为静态变量来跟踪点的坐标。
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
bool valid=SomeMethod();
if(valid)
next();
else
context.Result = Content("Failed to validate")
}