2016-12-30 4 views
0

私は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()機能が実行されるたびに更新され、nodehereの両方を定期的に更新する必要があります。だから、各反復がアリの最新のパスセグメントを表示してはいけませんか?

誰かが問題を説明できますか? とPathTransition()を利用してこれらのセグメントを表示することはできません。Line()を使用しないでください。

+0

animate関数からpathA = new Path()という行を削除すると、antは以前の位置から現在の位置に移動せず、実際には原点から現在の位置まですべて移動します。ただし、この場合、パスは必要に応じて更新されます。 –

答えて

0

あなたのアプローチは間違っていません。 animate()を呼び出すたびに問題が発生するだけで、形成されたパスの座標は以前と同じになります。パスの座標は、常に次の

1.0, 1.0 for moveTo and 5.0,5.0 for LineTo 

あなたはpathが新しいものになっていることとして、新鮮な座標を毎回渡す必要が戻ってきています。また、古いパスを新しいパスとともに表示し続けるには、新しく作成したpathを続けてGroupに追加する必要があります。

コードで変更した内容は次のとおりです。見てみましょう。

import java.util.ArrayList; 
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.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; 

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); 
    Group root; //Made root as global variable 
    int n = 10; 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     root = new Group(); 

     root.getChildren().addAll(node); 

     Scene scene = new Scene(root, sceneWidth, sceneHeight); 

     primaryStage.setScene(scene); 
     primaryStage.show(); 

     animate(0.0f, 0.0f, 5.0f, 5.0f); //Passing initial coordinates to the method 

    } 

    //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(float moveX, float moveY, float lineX, float lineY) { 
     Path pathA = new Path(); 
     root.getChildren().add(pathA); 
     nextPos(move, N); 
     int y1 = reconvertY(move.get(move.size() - 1), N); 
     int x1 = reconvertX(move.get(move.size() - 1), N, y1); 
     //Applying coordinates as obtained 
     pathA.getElements().add(new MoveTo(moveX, moveY)); 
     pathA.getElements().add(new LineTo(lineX, lineY)); 
     pathA.setStroke(Color.RED); 
     pathA.setStrokeWidth(1.0); 

     PathTransition pathTransitionA = new PathTransition(); 
     pathTransitionA.setDuration(Duration.millis(100)); 
     pathTransitionA.setNode(node); 
     pathTransitionA.setPath(pathA); 

     pathTransitionA.play(); 

     pathTransitionA.setOnFinished(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 

       if (pathTransitionA.getStatus() == Status.RUNNING) { 
        return; 
       } 

       animate(lineX, lineY, lineX + 2, lineY + 2); //previous path's endpoint makes the start point of the new Path 
      } 
     }); 

    } 

    //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); 

     } 

    } 

} 

希望です。

+0

アニメーション関数を初期化しませんでした。しかし、それでも私はあなたが行った変更の残りの部分を作ったし、それはうまく動作します。どうもありがとう! –

+0

なぜ二重の値を取ることができないのですか? –

+0

私は関数の定義を変更しませんでした。ごめんなさい。私はまだ私のバージョンのPathTransitionを使用していました。私は、グローバルノードをルートにして、animate関数でpathAを追加しました。それが問題を解決しました。しかし、あなたのコードは、とにかくとてもきれいですので、私はこれを使うつもりです。 –

関連する問題