JavaFX形状和多边形的交集

JavaFX形状和多边形的交集,javafx,shape,intersect,Javafx,Shape,Intersect,我目前正在使用JavaFX研究不同形状之间边界的相交。 我想检测两个多边形在其点上的碰撞,而不是在其边界上的碰撞(即2个多边形) 请参见图1:非期望行为和图2:期望行为 是否有任何现有算法可以帮助我或使用任何库? 提前感谢:) 以下是我的解决方案: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.paint

我目前正在使用JavaFX研究不同形状之间边界的相交。 我想检测两个多边形在其点上的碰撞,而不是在其边界上的碰撞(即2个多边形)

请参见图1:非期望行为和图2:期望行为

是否有任何现有算法可以帮助我或使用任何库? 提前感谢:)

以下是我的解决方案:

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);
}
}
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Polygon;
导入javafx.scene.shape.shape;
导入javafx.stage.stage;
公共类测试仪扩展应用程序{
@凌驾
public void start(Stage)引发异常{
窗格根=新窗格();
root.setStyle(“-fx背景色:青色;”);
多边形p1=新多边形();
p1.getPoints().addAll(新的双精度[]{
50.,50.,
50.,100.,
60.,100.,
60.,80.,
80.,70.,
80.,100.,
100.,100.,
100.,50.
});
p1.设置填充(颜色为绿色);
多边形p2=新多边形();
p2.getPoints().addAll(新的双精度[]{
65.,100.,
65.,90.,
75.,80.,
100.,100.
});
p2.设置填充(颜色为红色);
root.getChildren().addAll(p1,p2);
舞台场景(新场景(根));
stage.show();
形状相交=形状相交(p1,p2);
root.getChildren().add(inter);
System.out.println(inter.getLayoutBounds().getWidth()+“:“+inter.getLayoutBounds().getHeight());

if(inter.getLayoutBounds().getHeight()如果您可以在应用程序中使用
java.awt.geom
包,我建议您查看该类,尤其是
intersect
方法

基本上你可以这样做:

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

您可以在同一个包中使用
GeneralPath
类创建任意区域。

我正在玩您的代码\,我找到了这个解决方案,我在
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);
    }
}
公共类测试仪扩展应用程序{
形间;
点2D pc;
双initX,initY,mx,my;
@凌驾
public void start(Stage)引发异常{
窗格根=新窗格();
root.setStyle(“-fx背景色:青色;”);
最终多边形p2=新多边形();
最终多边形p1=新多边形();
p1.getPoints().addAll(新的双精度[]{
50., 50.,
50., 100.,
60., 100.,
60., 55.,
80., 70.,
80., 100.,
100., 100.,
100., 50.
});
p1.设置填充(颜色为绿色);
p2.getPoints().addAll(新的双精度[]{
65., 100.,
65., 45.,
75., 80.,
100., 100.
});
p2.设置填充(颜色为红色);
p1.setTranslateX(400);
p1.setTranslateY(250);
p2.setOnMousePressed(新的EventHandler(){
公共无效句柄(MouseEvent me){
initX=p2.getTranslateX();
initY=p2.getTranslateX();
pc=newpoint2d(me.getSceneX(),me.getSceneY());
}
});
p2.setOnMouseDrawed(新的EventHandler(){
公共无效句柄(MouseEvent me){
double dragX=me.getSceneX()-pc.getX();
double dragY=me.getSceneY()-pc.getY();
双newXPosition=initX+dragX;
双新位置=initY+dragY;
p2.setTranslateX(新位置);
p2.setTranslateY(新位置);
System.out.println(“无交叉口”);
if(Shape.intersect(p2,p1).getBoundsInLocal().isEmpty()==false){
p1.setTranslateX(p2.getTranslateX()+mx);
p1.setTranslateY(p2.getTranslateY()+my);
System.out.println(“colision”);
}否则{
mx=p1.getTranslateX()-p2.getTranslateX();
my=p1.getTranslateY()-p2.getTranslateY();
}
}
});
root.getChildren().addAll(p1,p2);
最终场景=新场景(根,1200,850);
舞台场景;
stage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

您可能需要检查一个多边形的边的交点是否在另一个多边形的边界内。使用:
mypolygon1.getBoundsInLocal().contains(myPolygon2.getBoundsInLocal())
可能重复@user I tested,但这是图1中的情况。jewelsea的答案最适合您。我测试了Shape.intersect(…);似乎还可以。我更新了我的示例。不,对不起,如果可能的话,我只想使用JavaFX,我现在正在深入研究intersect方法,但是谢谢。我有一个问题:是否可以将java.awt.geom Area类转换成JavaFX多边形?我有一个swing应用程序,我想转换成JavaFX。谢谢。@DavemM这将是一个好的选择新问题,我想说。但答案可能是:只有当区域描述多边形时,在这种情况下,您将使用
getPathIterator
,在形状上迭代并创建FX多边形。