Path2D - .contain()无效

时间:2018-04-18 20:53:21

标签: java arrays gps path-2d

我正在尝试使用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));
}


}

2 个答案:

答案 0 :(得分:2)

如何创建多边形?

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

  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
    

    并且将在内部考虑这一点。

答案 1 :(得分: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()从最后一个点到第一个点绘制直线。