Path2D -- .contain() 不起作用



我正在尝试使用 Path2D 查看一个点是否包含在多边形中。

最后一行System.out.println(poly.contains(lat1, lon1((打印"false",即使我知道坐标(lat1,lon1(在"testBound"中分离的多边形内。".contain(("不起作用吗?我错过了什么吗?

    package poly;
import java.awt.Polygon;
import java.awt.geom.Path2D;
import java.util.ArrayList;
import java.util.Arrays;
public class Polygon3 {
public static final double lat1 = 40.1032946;
public static final double lon1 = -84.5110052;
public static final String testBound = "40.203294,-84.521005;40.203294,-84.501005;40.003294,-84.521005;40.003294,-84.501005";


public static void main(String[] args) {
    String[] test = testBound.split(";");
    ArrayList<Double> latList = new ArrayList<Double>();
    ArrayList<Double> lonList = new ArrayList<Double>();
    for(String t : test) {
        String[] latlng = t.split(",");
        latList.add(Double.parseDouble(latlng[0]));
        lonList.add(Double.parseDouble(latlng[1]));
    }
    System.out.println(latList);
    System.out.println(lonList);
    Double latpoints[] = latList.toArray(new Double[latList.size()]);
    Double lonpoints[] = lonList.toArray(new Double[lonList.size()]);
    System.out.println(latpoints);
    System.out.println(lonpoints);
    Path2D poly = new Path2D.Double();
    for(int i = 0; i < latpoints.length; i++) {
        poly.moveTo(latpoints[i], lonpoints[i]);
    }
    poly.closePath();
    String testing = poly.toString();
    System.out.println(testing);
    System.out.println(poly.contains(lat1, lon1));
}

}

如何创建多边形?

要创建封闭多边形,您需要:

  1. 使用moveTo移动到第一个点
  2. 使用lineTo连接所有其他点
  3. 使用closePath将最后一个点与第一个点连接
  4. 起来

例如:

for (int i = 0; i < latpoints.length; i++) {
    if (i == 0) {
        poly.moveTo(latpoints[i], lonpoints[i]);
    }
    else {
        poly.lineTo(latpoints[i], lonpoints[i]);
    }
}
poly.closePath();

为什么包含返回 false?

contains返回false,因为由于点数顺序,您创建的不是正方形,而是沙漏形状:

3   1
| X |
4   2

由于要测试的点位于中心,因此可能不会将其考虑在形状内部。

如果你交换第三点和第四点的顺序,那么你就会创建一个正方形:

4 - 1
|   |
3 - 2

这一点将在内部考虑。

首先,您没有正确创建多边形。moveTo 每次将此多边形的第一个点移动到不同的位置,但不绘制线条。您需要执行以下操作来创建多边形:

    poly.moveTo(latpoints[0], lonpoints[0]);
    for(int i = 1; i < latpoints.length - 1; i++) {
        poly.lineTo(latpoints[i], lonpoints[i]);
    }

请注意,我们从开头绘制 2 条线,通过 closePath(( 我们可以完成这个形状,因为 closePath(( 从最后一个点到第一个点画直线。

相关内容

  • 没有找到相关文章

最新更新