繁体   English   中英

检查多边形是否在多边形内

[英]Check if polygon is inside a polygon

昨天我想检查一个点是否在多边形内并找到了这个很棒的脚本: https//github.com/tparkin/Google-Maps-Point-in-Polygon

但今天在工作中我被告知我们的客户需要检查一个多边形是否在另一个多边形内。 我想知道是否有一个公式,我可以采取,比方说,两个坐标(而不是一个检查一个点),并从这两个坐标生成一个矩形,并检查该矩形是否在多边形内。

我不知道我是不是在问一个愚蠢的问题(高中的一位老师常说“没有愚蠢的问题,只有傻瓜不问”),但如果你完全不了解我,只是一点点,如果你告诉我从哪里开始,我将不胜感激。

对每对线执行线交叉测试,每个线对应一个。 如果没有线对相交并且多边形A的一个线端点在多边形B内,则A完全在B内。

以上适用于任何类型的多边形。 如果多边形是凸的,则可以跳过线交叉测试,只测试A的所有线端点都在B内。

如果确实有必要,可以使用扫描线算法加速线路交叉测试。

也许这段代码可以帮助你:

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

首先使用脚本检查多边形中的一个角点是否在另一个多边形内。 然后检查多边形中的任何线是否与另一个多边形中的任何线相交。 如果不这样做,则多边形位于另一个多边形内。

我必须找到类似的解决方案。 这是我到目前为止:

  1. 首先,我获取了array[pol1cords[cord1,cord2...],pol2cords[cord1,cord2...],..]中的所有1级多边形坐标array[pol1cords[cord1,cord2...],pol2cords[cord1,cord2...],..]
  2. 然后获取所有3级多边形并绘制它们
  3. 然后,对于每个1级多边形,我检查每个多边形坐标是否在绘制的3级坐标内与google.maps.geometry.poly.containsLocation(latLng, pol)
  4. 如果它返回true计数器会上升
  5. 最后,如果计数器等于该数组的长度,则结果为真(1级多边形位于level3多边形内)。

我的算法看起来像这样:

“”区域(级别3) - >区域(级别2) - > VDC(级别1)“”vdcs = getVDCs(); - >给出一个数组中的vdcs,其中包含name,id和polygon坐标zones = getZones(); - >给出一个数组中带有name,id和polygon坐标的区域

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

多边形凸出来了吗? 因为,如果是,您可以为“矩形”的两个“角”运行“多边形点”脚本。 如果两个角都在,并且多边形没有向内的“曲线”,那么整个矩形是不是都在?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM