Java 计算点是否位于多边形内
我试图检查点阵列列表中包含的点是否在多边形内。多边形和要检查的点也是结构化的:Java 计算点是否位于多边形内,java,math,geometry,polygon,Java,Math,Geometry,Polygon,我试图检查点阵列列表中包含的点是否在多边形内。多边形和要检查的点也是结构化的: private ArrayList<Pair<Float,Float>> polygon, points; 私有阵列列表多边形,点; 我的算法是从多边形的前两点开始,检查点中包含的点是否包含在它们中。如果没有,他将再次检查,比较第一个和第三个等,直到所有多边形数组列表都已滚动。如果布尔变量从未变为true,则表示该点不包含在多边形中。问题在于,使用此方法,它还可以找到不应包含的点,如下图所
private ArrayList<Pair<Float,Float>> polygon, points;
私有阵列列表多边形,点;
我的算法是从多边形的前两点开始,检查点中包含的点是否包含在它们中。如果没有,他将再次检查,比较第一个和第三个等,直到所有多边形数组列表都已滚动。如果布尔变量从未变为true,则表示该点不包含在多边形中。问题在于,使用此方法,它还可以找到不应包含的点,如下图所示:
如果我在P1和P2之间的区域中绘制一些东西,它将返回真值,即使存在明显不在形状中的零件。如何改进算法:
boolean between = false;
for (int j=0; j<points.size(); j++, between=false) {
for (int i=0; i<polygon.size() && !between; i++) {
float x1 = polygon.get(i).first;
float y1 = polygon.get(i).second;
for (int ii=0; ii<polygon.size() && !between; ii++) {
float x2 = polygon.get(ii).first;
float y2 = polygon.get(ii).second;
if ((points.get(j).first < x1 && points.get(j).first > x2) &&
(points.get(j).second < y1 && points.get(j).second > y2))
between = true;
}
}
if (!between) scoreDrawOut = 1; else scoreDrawIn = 1;
}
boolean-between=false;
对于(intj=0;jIs)有什么深刻的理由不只是从点创建一个,然后简单地调用path.contains(点)
?@Marco13是否可以在路径中转换该ArrayList?您可以使用它来构造路径。我按照@Marco13的建议更新了该方法,但该方法包含的内容未被识别。我还更新了该问题,以便您可以看到。有什么深刻的理由不只是从点创建一个数组,然后简单地调用Path.contain吗s(point)
?@Marco13是否可以在路径中转换该ArrayList?您可以使用它来构造路径。我按照@Marco13的建议更新了该方法,但该方法包含的内容未被识别。我还更新了该问题,以便您可以看到。
private void checkDrawOut() {
Path shape = new Path();
for (int i=0; i<figura.size(); i++)
shape.moveTo(figura.get(i).first, figura.get(i).second);
boolean compreso = false;
for (int x=0; x<segments.size(); x++) {
ArrayList<Pair<Float, Float>> punti = segments.get(x);
for (int j = 0; j < punti.size(); j++, compreso = false) {
if (shape.contains(punti.get(j).first, punti.get(j).second))
compreso = true;
}
if (!compreso) scoreDrawOut = 1;
else scoreDrawIn = 1;
}
}