私はjavafxを初めて使用しており、これを使ってAnt Colony Optimizationアルゴリズムのバージョンを実行していました。私は飛行機の中をランダムに動き回るアリのような小さな円を表示するはずのコードを書いています。これはうまくいった。しかし、私はシーンの上に蟻のパスを表示するコードを変更することはできませんでした。基本的に私は、antが2D平面上を動くように、antの経路を線で強調したい。ここ更新されたPath()を使用してシーンに新しい行を描画する
コードである:実行に
import java.util.ArrayList;
import java.util.Random;
//Line can either be a sound or a shape
import javafx.animation.Animation.Status;
import javafx.animation.PathTransition;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.Path;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.lang.Object;
import javafx.scene.Node;
import javafx.scene.shape.Shape;
import javafx.scene.shape.Line;
public class TestMotion extends Application {
int N = 10;
static ArrayList<Integer> move = new ArrayList<Integer>();
private double sceneWidth = 512;
private double sceneHeight = 512;
MyNode node = new MyNode(0,0,5);
Path pathA = new Path();
int n = 10;
@Override
public void start(Stage primaryStage) throws Exception {
Group root = new Group();
root.getChildren().addAll(node, pathA);
Scene scene = new Scene(root, sceneWidth, sceneHeight);
primaryStage.setScene(scene);
primaryStage.show();
animate();
}
//convention conversion (i,j) to node number x
public static int convert(int i, int j, int N)
{
return (j*N +i+1);
}
//convention conversion node number x to (i,j)
//implement in order of definition
public static int reconvertY(int x, int N)
{
return (int) java.lang.Math.floor((x-1)/N);
}
public static int reconvertX(int x, int N, int j)
{
return (x-j*N-1);
}
private void animate() {
nextPos(move, N);
int y1 = reconvertY(move.get(move.size()-1), N);
int x1 = reconvertX(move.get(move.size()-1), N, y1);
MyNode here = new MyNode(10*x1, 10*y1, 1);
System.out.println(move.get(move.size()-1));
pathA.getElements().add (new MoveTo (node.getTranslateX() + node.getBoundsInParent().getWidth()/2.0, node.getTranslateY() + node.getBoundsInParent().getHeight()/2.0));
pathA.getElements().add (new LineTo(here.getTranslateX() + here.getBoundsInParent().getWidth()/2.0, here.getTranslateY() + here.getBoundsInParent().getHeight()/2.0));
pathA.setStroke(Color.RED);
pathA.setStrokeWidth(1.0);
PathTransition pathTransitionA = new PathTransition();
pathTransitionA.setDuration(Duration.millis(1000));
pathTransitionA.setNode(node);
pathTransitionA.setPath(pathA);
pathTransitionA.play();
pathA = new Path();
pathTransitionA.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if(pathTransitionA.getStatus() == Status.RUNNING)
{return;}
animate();
}
});
}
//allot new node to the arraylist such that it is adjacent to the previously assigned node
private void nextPos(ArrayList<Integer> array, int N)
{
//I removed this part to save space because it is probably irrelevant the the problem at hand
}
public static void main(String[] args) {
move.add(1);
launch(args);
}
public static class MyNode extends StackPane {
public MyNode(double x, double y, double r) {
// create circle
Circle circle = new Circle();
circle.setRadius(r);
circle.setFill(Color.BLUE);
// set position
setTranslateX(x);
setTranslateY(y);
getChildren().add(circle);
}
}
}
シーンのみ最初のステップのための経路を表示した後、完全パスを表示停止します。なぜ私は理解できません。 path
は、animate()
機能が実行されるたびに更新され、node
とhere
の両方を定期的に更新する必要があります。だから、各反復がアリの最新のパスセグメントを表示してはいけませんか?
誰かが問題を説明できますか? とPathTransition()
を利用してこれらのセグメントを表示することはできません。Line()
を使用しないでください。
animate関数からpathA = new Path()という行を削除すると、antは以前の位置から現在の位置に移動せず、実際には原点から現在の位置まですべて移動します。ただし、この場合、パスは必要に応じて更新されます。 –