Path2D——.contain() 不工作
Path2D -- .contain() not working
我正在尝试使用 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));
}
}
首先,你没有正确创建多边形。
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() 从最后一点到第一个点绘制直线。
如何创建多边形?
要创建闭合多边形,您需要:
- 使用
moveTo
移动到第一个点
- 使用
lineTo
连接所有其他点
- 使用
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();
为什么包含 returns false?
contains
returns false
因为根据点的顺序,您创建的不是正方形而是沙漏形状:
3 1
| X |
4 2
由于您要测试的点位于中心,因此可能不会考虑在形状内部。
如果交换第三个点和第四个点的顺序,则创建一个正方形:
4 - 1
| |
3 - 2
并且会考虑里面的点数
我正在尝试使用 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));
}
}
首先,你没有正确创建多边形。 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() 从最后一点到第一个点绘制直线。
如何创建多边形?
要创建闭合多边形,您需要:
- 使用
moveTo
移动到第一个点 - 使用
lineTo
连接所有其他点 - 使用
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();
为什么包含 returns false?
contains
returns false
因为根据点的顺序,您创建的不是正方形而是沙漏形状:
3 1
| X |
4 2
由于您要测试的点位于中心,因此可能不会考虑在形状内部。
如果交换第三个点和第四个点的顺序,则创建一个正方形:
4 - 1
| |
3 - 2
并且会考虑里面的点数