昨天我想检查一个点是否在多边形内并找到了这个很棒的脚本:https://github.com/tparkin/Google-Maps-Point-in-Polygon
但是今天在工作中我被告知我们的客户需要检查一个多边形是否在另一个多边形内。我想知道是否有一个公式,我可以采取两个坐标(而不是一个检查一个点),从这两个坐标生成一个矩形,并检查该矩形是否在多边形内。
我不知道我是否在问一个愚蠢的问题(高中的一位老师常说“没有愚蠢的问题,只有傻瓜不问”),但如果你不明白我完全只是一点点,如果你告诉我从哪里开始,我将不胜感激。
答案 0 :(得分:27)
对每对线执行line intersection测试,每个线对应一个。如果没有线对相交,并且多边形A的一个线端点在多边形B内,则A完全在B内。
以上适用于任何类型的多边形。如果多边形是凸的,则可以跳过线交叉测试,只测试A的所有线端点都在B内。
如果确实有必要,可以使用sweep line algorithm加快线路相交测试。
答案 1 :(得分:1)
首先使用脚本检查多边形中的一个角点是否在另一个多边形内。然后检查多边形中的任何线是否与另一个多边形中的任何线相交。如果不这样做,则多边形位于另一个多边形内。
答案 2 :(得分:1)
也许这段代码可以帮到你:
package com.polygons;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
/**
* Utility to Manipulate Polygons
*
* @author fernando.hernandez
*
*/
public class PolygonUtils {
/**
* Check if polygon2 is inside polygon to polygon1
* @param polygon1 polygon that contains other
* @param polygon2 polygon that is inner to other
* @return true if polygon2 is inner to polygon1
*/
public boolean isInsidePolygon(Polygon polygon1, Polygon polygon2){
//all points in inner Polygon should be contained in polygon
int[] xpoints = polygon2.xpoints;
int[] ypoints = polygon2.ypoints;
boolean result = true;
for (int i = 0, j = 0; i < polygon2.npoints ; i++,j++) {
result = polygon1.contains(new Point(xpoints[i], ypoints[j]));
if(!result) break;
}
return result;
}
}
答案 3 :(得分:0)
多边形凸出来了吗?因为,如果是,您可以为“矩形”的两个“角”运行“多边形点”脚本。如果两个角都在,并且多边形内部没有“曲线”,则整个矩形不会在?
答案 4 :(得分:0)
我必须找到类似的解决方案。以下是我到目前为止的情况:
array[pol1cords[cord1,cord2...],pol2cords[cord1,cord2...],..]
google.maps.geometry.poly.containsLocation(latLng, pol)
true
,计数器会上升我的算法看起来像这样:
&#34;&#34;区域(级别3) - &gt;区域(级别2) - > VDC(级别1)&#34;&#34; vdcs = getVDCs(); - &GT;给出一个数组中的vdcs,其中包含name,id和polygon坐标zones = getZones(); - &gt;给出一个名称,id和的数组中的区域 多边形坐标
foreach(zones as zone){
drawPolygon(zone[coordinates]);
foreach(vdcs as vdc){
foreach(vdc[coordinates] as coordinate){
result = checkLocation(zone, coordinate);
if(result) counter++;
}
if(counter = vdc[coordinates].length){writeConsole(vdc_id+"true in"+zone_id)}
}
}