2013-11-27 155 views
2

我目前正在研究JavaFX與不同形狀之間的邊界相交。 我想檢測兩個多邊形在其點上的碰撞,而不是它們的邊界(即2個多邊形)。JavaFX十字形狀與多邊形

請參閱圖1:不需要的行爲,圖2:所需的行爲。

是否有任何現有的算法來幫助我或任何圖書館使用? 感謝提前:)

enter image description here

在這裏找到我的解決辦法:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Polygon; 
import javafx.scene.shape.Shape; 
import javafx.stage.Stage; 

public class Tester extends Application { 

@Override 
public void start(Stage stage) throws Exception { 
    Pane root = new Pane(); 
    root.setStyle("-fx-background-color:cyan;"); 
    Polygon p1 = new Polygon(); 
    p1.getPoints().addAll(new Double[]{ 
      50.,50., 
      50.,100., 
      60.,100., 
      60.,80., 
      80.,70., 
      80.,100., 
      100.,100., 
      100.,50. 
    }); 
    p1.setFill(Color.GREEN); 

    Polygon p2 = new Polygon(); 
    p2.getPoints().addAll(new Double[]{ 
      65.,100., 
      65.,90., 
      75.,80., 
      100.,100. 
    }); 
    p2.setFill(Color.RED); 

    root.getChildren().addAll(p1,p2); 

    stage.setScene(new Scene(root)); 
    stage.show(); 

    Shape inter = Shape.intersect(p1, p2); 
    root.getChildren().add(inter); 

    System.out.println(inter.getLayoutBounds().getWidth() + ":" + inter.getLayoutBounds().getHeight()); 
    if(inter.getLayoutBounds().getHeight()<=0 || inter.getLayoutBounds().getWidth()<=0) { 
     System.out.println("No intersection"); 
    } 
    else { 
     System.out.println("intersection detected"); 
    } 
} 

public static void main(String[] args) { 
    launch(args); 
} 
} 

輸出:

enter image description here

20.0:16.0 intersection detected

它似乎正常工作,我將用Path對象進行測試以替換Polygon對象。

+0

你可能要檢查,如果你的一個多邊形的邊的交點是在其他的邊界。使用:'mypolygon1.getBoundsInLocal()。contains(myPolygon2.getBoundsInLocal())' – Aspirant

+0

[檢查形狀與JavaFX的碰撞]的可能的重複(http://stackoverflow.com/questions/15013913/checking-collision-of-shapes -with-javafx) – jewelsea

+0

@user我測試過,但它是圖1的情況。 – PacDroid

回答

0

如果你可以在你的應用程序中使用java.awt.geom包,我建議你看看Area類,特別是intersect方法。

基本上,你可以這樣做:

area1.intersect(area2); 
boolean areasintersect = !area1.isEmpty(); 

您可以使用該GeneralPath類在同一個包的任意區域。

+0

沒有抱歉我只想使用JavaFX,如果可能的話,我正在挖掘相交方法,但謝謝。 – PacDroid

+0

我對此有疑問:是否可以將java.awt.geom Area類轉換爲JavaFx Polygon?我有一個我想轉換爲JavaFx的swing應用程序。謝謝。 –

+0

@DavemM這將是一個新問題,我會說。但是答案可能是:只有Area描述了一個多邊形,在這種情況下,你將使用'getPathIterator',迭代該形狀並創建FX多邊形。 – Sebastian

1

我正在玩你的代碼\,我發現這個解決方案,我把鼠標事件添加到polygon2,然後我修改了if語句。如果不是太晚,試試。

public class Tester extends Application { 

    Shape inter; 
    Point2D pc; 
    double initX, initY, mx, my; 

    @Override 
    public void start(Stage stage) throws Exception { 
     Pane root = new Pane(); 
     root.setStyle("-fx-background-color:cyan;"); 
     final Polygon p2 = new Polygon(); 
     final Polygon p1 = new Polygon(); 
     p1.getPoints().addAll(new Double[]{ 
      50., 50., 
      50., 100., 
      60., 100., 
      60., 55., 
      80., 70., 
      80., 100., 
      100., 100., 
      100., 50. 
     }); 
     p1.setFill(Color.GREEN); 
     p2.getPoints().addAll(new Double[]{ 
      65., 100., 
      65., 45., 
      75., 80., 
      100., 100. 
     }); 

     p2.setFill(Color.RED); 

     p1.setTranslateX(400); 
     p1.setTranslateY(250); 

     p2.setOnMousePressed(new EventHandler<MouseEvent>() { 
      public void handle(MouseEvent me) { 
       initX = p2.getTranslateX(); 
       initY = p2.getTranslateX(); 
       pc = new Point2D(me.getSceneX(), me.getSceneY()); 
      } 
     }); 

     p2.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      public void handle(MouseEvent me) { 
       double dragX = me.getSceneX() - pc.getX(); 
       double dragY = me.getSceneY() - pc.getY(); 
       double newXPosition = initX + dragX; 
       double newYPosition = initY + dragY; 
       p2.setTranslateX(newXPosition); 
       p2.setTranslateY(newYPosition); 
       System.out.println("no intersection"); 
       if (Shape.intersect(p2, p1).getBoundsInLocal().isEmpty() == false) { 
        p1.setTranslateX(p2.getTranslateX() + mx); 
        p1.setTranslateY(p2.getTranslateY() + my); 
        System.out.println("colision"); 

       } else { 
        mx = p1.getTranslateX() - p2.getTranslateX(); 
        my = p1.getTranslateY() - p2.getTranslateY(); 
       } 

      } 
     }); 
     root.getChildren().addAll(p1, p2); 

     final Scene scene = new Scene(root, 1200, 850); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
}