Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查多边形是否在多边形内_Javascript_Algorithm_Google Maps_Geometry_Polygon - Fatal编程技术网

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

Javascript 检查多边形是否在多边形内,javascript,algorithm,google-maps,geometry,polygon,Javascript,Algorithm,Google Maps,Geometry,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;
    }
}
package.com;
导入java.awt.Point;
导入java.awt.Polygon;
导入java.awt.geom.Line2D;
导入java.awt.geom.Point2D;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入org.apache.commons.collections.CollectionUtils;
/**
*用于操纵多边形的工具
* 
*@作者费尔南多·埃尔南德斯
*
*/
公共级蓼科植物{
/**
*检查多边形2是否位于多边形到多边形1的内部
*@param polygon1包含其他多边形的多边形
*@param polygon2多边形位于其他多边形的内部
*@如果polygon2在polygon1的内部,则返回true
*/
公共布尔值isInsidePolygon(多边形多边形1,多边形多边形2){
//内多边形中的所有点都应包含在多边形中
int[]xpoints=polygon2.xpoints;
int[]ypoints=polygon2.ypoints;
布尔结果=真;
对于(int i=0,j=0;i
我必须找到类似的解决方案。以下是我到目前为止的情况:

  • 首先,我获取了
    数组[pol1cords[cord1,cord2…],pol2cords[cord1,cord2…],中的所有1级多边形坐标。
  • 然后获取所有3级多边形并绘制它们
  • 然后,对于每个级别1多边形,我使用
    google.maps.geometry.poly.containsLocation(latLng,pol)
  • 如果返回
    true
    计数器将上升
  • 最后,如果计数器等于该数组的长度,则结果为真(级别1多边形位于级别3多边形内) 我的算法如下所示:

    “区域(三级)->地区(二级)->VDC(一级)”“vdcs=getVDCs(); ->在具有名称、id和多边形坐标zones=getZones();->在具有名称、id和 多边形坐标


    检查多边形A的所有点是否在多边形BI内,首先检查一个多边形的边界框的角是否在另一个多边形内;这将是一个快速的测试。不过,在那之后,按照@M28的建议,检查一个多边形在另一个多边形内的每个点。@M28只检查顶点不起作用。如果B不是凸的,那么(很多)情况下A的所有顶点都在B中,但A的一部分仍然在B之外交叉。@payne True,但他说他只会使用rectangles@M28当前位置他说他正在检查一个矩形是否在多边形内。考虑一个多边形,它是一个星形形状:矩形的所有角落都可以在恒星内部,但是矩形的一部分可以位于恒星之外。如果没有直线交点,那么你不需要检查一个点吗?那就行了。不过算法很慢,不是吗?O(n!)我想。@Hops O(NM),其中A有n条边,B有M条边。如果有必要,你可以加快速度,但由于OP提到其中一个多边形是矩形,我看不到这一点,因为它使解变得复杂得多。我在《如何做》中编辑过。嘎。大脑放屁在我这边。这就是我在周五下午想清楚这件事的结果。边。。。不是分数。出于某种原因,我想你必须检查多边形中每一条可能的线。。。不是构成多边形的线。这是其中的一天,谢谢你让我直截了当:)如果没有交叉路口,他们也可以彼此靠近。它们不必彼此包含。这只适用于凸面外部形状。凹面外部形状可以包含内部形状的所有点,但具有重叠边。
    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)}
        }
    }