0

I am trying to see if a point is contained within a polygon using Path2D.

The last line, System.out.println(poly.contains(lat1, lon1)), prints "false" even though I know the coordinates(lat1, lon1) are within the polygon sapecified in "testBound". Is the ".contain()" not working? Am i missing something?

    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));
}


}
4

2 回答 2

3

如何创建多边形?

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

  1. 用于moveTo移动到第一点
  2. 用于lineTo连接所有其他点
  3. 用于closePath连接最后一个点和第一个点

例如:

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

并且该点将被考虑在内。

于 2018-04-18T21:56:07.547 回答
0

首先,您没有正确创建多边形。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() 从最后一个点到第一个点绘制直线。

于 2018-04-18T21:26:12.423 回答