我目前正在使用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);
}
}
输出:
20.0:16.0检测到交叉口
它似乎工作正常,我将使用Path对象进行测试以替换多边形objets。
如果您可以在应用程序中使用java.awt.geom
包,我建议您查看Area
类,尤其是intersect
方法。
基本上你可以这样做:
area1.intersect(area2);
boolean areasintersect = !area1.isEmpty();
可以使用同一包中的 GeneralPath
类创建任意区域。
我在玩你的代码,发现了这个解决方案,我在< code>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);
}
}
为什么这工作正常: 这会产生运行时错误 错误: 这没有任何意义。第一个代码工作正常,三角形画好了,但第二个代码不行。有人能解释一下我做错了什么吗...
我有两个形状多边形实例(由lon,lat点组成),在不同的部分相交。我试图遍历,确定两个多边形之间是否有交集,然后创建一个新的多边形,排除该交集。从所附的图像来看,我基本上不希望红色的圆圈与黄色的轮廓重叠,我希望边缘正好是黄色轮廓开始的地方。 我已经尝试按照这里的说明,但它根本没有改变我的输出,而且我不想将它们合并到一个级联的联合中。我没有得到任何错误消息,但是当我将这些多边形添加到一个KML文件
主要内容:JavaFX多边形折线JavaFX多边形折线 多边形,一个简单的示例代码如下所示 - 上面的代码生成以下结果。 折线示例,一个简单的示例代码如下所示 - 上面的代码生成以下结果。
有没有办法在JavaFX中修改多边形?例如,如果我有一个三角形,我按下然后从该三角形拖动一个点,三角形将用该点的新坐标进行修改。
我在一个板上有几个对象,我想通过坐标获取这些对象的索引。我尝试过制作一个处理程序,并使用与相结合,但没有成功。这些方法给了我不同的坐标,无法匹配它们。 我是否应该用光标的坐标画一个矩形,并使用< code > getBoundInParent()。intersects方法? 有什么建议吗?
我有一个类“Vertex”包含双x,y。另一个类“Face”包含一个“Vertex”对象列表。相邻面共享相同的顶点。 目前,我正在为每个脸创建一个javafx.scene.shape.多边形,并将它们全部添加到我的场景中,看起来像这样:截图 现在我计划修改多边形,类似于:JavaFX modify polygons 问题是多边形不会保存对顶点对象的引用,而是保存双值。当我改变一个点的位置时,相邻多