精华内容
下载资源
问答
  • 判断线段是否在多边形内

    千次阅读 2016-11-07 14:47:00
    1. 线段的两个端点都在多边形内。 2.线段和多边形的所有边都不内交(交点在线段端点是可以的,但是多边形顶点是不可以的)。 转载于:https://my.oschina.net/1024bits/blog/783118

    1. 线段的两个端点都在多边形内。

    2.线段和多边形的所有边都不内交(交点在线段端点是可以的,但是在多边形顶点是不可以的)。

    转载于:https://my.oschina.net/1024bits/blog/783118

    展开全文
  • 判断点及线段是否在多边形内

    千次阅读 2014-05-21 10:13:59
    判断点(P)是否在多边形中,可以先以点p向左引一条射线(L),我们知道,从射线L左端的无穷远处开始一直到点P的过程中,当遇到多边形的第一个交点时L进入了多边形,当遇到第二个交点时,L穿出了多边形。。。。。。...

    昨天小学了一点计算几何学的内容,想把它记下来,以便以后翻阅。

    1.判断点是否在多边形中

    先说一下思路:

    判断点(P)是否在多边形中,可以先以点p向左引一条射线(L),我们知道,从射线L左端的无穷远处开始一直到点P的过程中,当遇到多边形的第一个交点时L进入了多边形,当遇到第二个交点时,L穿出了多边形。。。。。。。。。可知,规律如下,当在遇到P点之前L与多边形的交点为偶数个时,说明p点不在多边形内,当在遇到p点之前L与多边形得交点为奇数个时,说明P点在多边形内。

    但是,这个规律并不具有普遍性,还有几种特殊情况不满足此规律,需要额外考虑:

    (1)当点P在多边形的某条边上时,可以直接判断其在多边形中。

    (2)对于多边形的水平边不作考虑。

    (3)对于多边形的顶点与L相交,则需要判断该顶点是否为顶点所在的边的那个纵坐标较大的顶点,如果是较大的那个顶点与L相交则计数,否则忽略。

    伪代码如下:

    ?
    ........fun()
    {
          int count=0;
          //以P为端点从右向左引一条射线L 
          for (多边形的每一条边S) //遍历多边形的每一条边 
          {
               if (P在边S上)
               {
                    return ture; 
              
               if (S不是水平的)
               {
                     if (S的一个端点在L上)
                     {
                           if (该端点是S的较大端点)
                           {
                                 count++; 
                           }                    
                     }               
                     else if (S与L相交)
                     {
                           count++;
                    
              
         
          if (count%2==0)
          {
                return false ;
          }
          else
          {
                return true ;
          }
    }

    2.判断线段是否在多边形内

    思路:(1)首先,要判断一条线段是否在多边形内,先要判断线段的两个端点是否在多边形内。如果两个端点不全在多边形内,那么,线段肯定是不在多边形内的。

            (2)其次,如果线段和多边形的某条边内交(两线段内交是指两线段相交且交点不在两线段的端点),则线段肯定不在多边形内。

            (3)如果多边形的某个顶点和线段相交,则必须判断两相交交点之间的线段是否包含于多边形内。

    伪代码:

    ?
    if (线段PQ的端点不都在多边形内)
    {
          return false ;                              
    点集pointSet初始化为空;
    for (多边形的每一条边S)
    {
          if (线段的某个端点在S上)
          {
                将该端点加入pointSet;                       
          }                      
          else if (S的某个端点在线段PQ上)
          {
                将该端点加入pointSet;     
         
          else if (线段PQ与S相交)
          {
               return false ; //此时可以判断是内交了     
         
    将pointSet中的点按照X-Y坐标排序;
    for (pointSet中每两个相邻点pointSet[i],pointSet[i+1])
    {
          if (pointSet[i],pointSet[i+1]的中点不在多边形中)
          {
               return false ;                                               
          }                                                    
    return true ;
    展开全文
  • 判断线段是否在多边形内:  线段在多边形内的一个必要条件是线段的两个端点都在多边形内,但由于多边形可能为凹,所以这不能成为判断的充分条件。  如果线段和多边形的某条边内交(两线段内交是指两线段相交且...

    判断线段是否在多边形内:

      线段在多边形内的一个必要条件是线段的两个端点都在多边形内,但由于多边形可能为凹,所以这不能成为判断的充分条件。

      如果线段和多边形的某条边内交(两线段内交是指两线段相交且交点不在两线段的端点),

      因为多边形的边的左右两侧分属多边形内外不同部分,所以线段一定会有一部分在多边形外(见图a)。

      于是我们得到线段在多边形内的第二个必要条件:线段和多边形的所有边都不内交。

      线段和多边形交于线段的两端点并不会影响线段是否在多边形内;

      但是如果多边形的某个顶点和线段相交,还必须判断两相邻交点之间的线段是否包含于多边形内部(反例见图b)。

        

      因此我们可以先求出所有和线段相交的多边形的顶点,

      然后按照X-Y坐标排序(X坐标小的排在前面,对于X坐标相同的点,Y坐标小的排在前面,这种排序准则也是为了保证水平和垂直情况的判断正确)

      这样相邻的两个点就是在线段上相邻的两交点,如果任意相邻两点中点也在多边形内,则该线段一定在多边形内。

      对应的算法如下:

    if 线端PQ的端点不都在多边形内 
          then return false;
        点集pointSet初始化为空;
        for 多边形的每条边s
          do if 线段的某个端点在s上
               then 将该端点加入pointSet;
             else if s的某个端点在线段PQ上
               then 将该端点加入pointSet;
             else if s和线段PQ相交 // 这时候已经可以肯定是内交了
               then return false;
        将pointSet中的点按照X-Y坐标排序;
        for pointSet中每两个相邻点 pointSet[i] , pointSet[ i+1]
          do if pointSet[i] , pointSet[ i+1] 的中点不在多边形中
               then return false;
        return true;


    Very Beautiful!



    转载于:https://www.cnblogs.com/o8le/archive/2011/11/15/2250076.html

    展开全文
  • 判断线段相交及点是否在多边形内

    热门讨论 2011-10-08 08:50:50
    算法导论里面的关于线段是否相交以及点是否在多边形内判断的源代码,另包含一个说明文档~
  • 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点...

    转自https://www.cnblogs.com/charlee44/p/10704156.html

     

    1. 算法思路

    判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。如下图所示:

    算法步骤如下:

    1. 已知点point(x,y)和多边形Polygon的点有序集合(x1,y1;x2,y2;….xn,yn;);
    2. 以point为起点,以无穷远为终点作平行于X轴的射线line(x,y; -∞,y);循环取得多边形的每一条边side(xi,yi;xi+1,yi+1):
      1). 判断point(x,y)是否在side上,如果是,则返回true。
      2). 判断line与side是否有交点,如果有则count++。
    3. 判断交点的总数count,如果为奇数则返回true,偶数则返回false。

    2. 具体实现

    在具体的实现过程中,其实还有一个极端情况需要注意:当射线line经过的是多边形的顶点时,判断就会出现异常情况。针对这个问题,可以规定线段的两个端点,相对于另一个端点在上面的顶点称为上端点,下面是下端点。如果射线经过上端点,count加1,如果经过下端点,则count不必加1。具体实现如下:

    #include<iostream>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    
    #define EPSILON 0.000001
    
    using namespace std;
    
    //二维double矢量
    struct  Vec2d
    {
    	double x, y;
    
    	Vec2d()
    	{
    		x = 0.0;
    		y = 0.0;
    	}
    	Vec2d(double dx, double dy)
    	{
    		x = dx;
    		y = dy;
    	}
    	void Set(double dx, double dy)
    	{
    		x = dx;
    		y = dy;
    	}
    };
    
    //判断点在线段上
    bool IsPointOnLine(double px0, double py0, double px1, double py1, double px2, double py2)
    {
    	bool flag = false;
    	double d1 = (px1 - px0) * (py2 - py0) - (px2 - px0) * (py1 - py0);
    	if ((abs(d1) < EPSILON) && ((px0 - px1) * (px0 - px2) <= 0) && ((py0 - py1) * (py0 - py2) <= 0))
    	{
    		flag = true;
    	}
    	return flag;
    }
    
    //判断两线段相交
    bool IsIntersect(double px1, double py1, double px2, double py2, double px3, double py3, double px4, double py4)
    {
    	bool flag = false;
    	double d = (px2 - px1) * (py4 - py3) - (py2 - py1) * (px4 - px3);
    	if (d != 0)
    	{
    		double r = ((py1 - py3) * (px4 - px3) - (px1 - px3) * (py4 - py3)) / d;
    		double s = ((py1 - py3) * (px2 - px1) - (px1 - px3) * (py2 - py1)) / d;
    		if ((r >= 0) && (r <= 1) && (s >= 0) && (s <= 1))
    		{
    			flag = true;
    		}
    	}
    	return flag;
    }
    
    //判断点在多边形内
    bool Point_In_Polygon_2D(double x, double y, const vector<Vec2d> &POL)
    {	
    	bool isInside = false;
    	int count = 0;
    	
    	//
    	double minX = DBL_MAX;
    	for (int i = 0; i < POL.size(); i++)
    	{
    		minX = std::min(minX, POL[i].x);
    	}
    
    	//
    	double px = x;
    	double py = y;
    	double linePoint1x = x;
    	double linePoint1y = y;
    	double linePoint2x = minX -10;			//取最小的X值还小的值作为射线的终点
    	double linePoint2y = y;
    
    	//遍历每一条边
    	for (int i = 0; i < POL.size() - 1; i++)
    	{	
    		double cx1 = POL[i].x;
    		double cy1 = POL[i].y;
    		double cx2 = POL[i + 1].x;
    		double cy2 = POL[i + 1].y;
    				
    		if (IsPointOnLine(px, py, cx1, cy1, cx2, cy2))
    		{
    			return true;
    		}
    
    		if (fabs(cy2 - cy1) < EPSILON)   //平行则不相交
    		{
    			continue;
    		}
    
    		if (IsPointOnLine(cx1, cy1, linePoint1x, linePoint1y, linePoint2x, linePoint2y))
    		{
    			if (cy1 > cy2)			//只保证上端点+1
    			{
    				count++;
    			}
    		}
    		else if (IsPointOnLine(cx2, cy2, linePoint1x, linePoint1y, linePoint2x, linePoint2y))
    		{
    			if (cy2 > cy1)			//只保证上端点+1
    			{
    				count++;
    			}
    		}
    		else if (IsIntersect(cx1, cy1, cx2, cy2, linePoint1x, linePoint1y, linePoint2x, linePoint2y))   //已经排除平行的情况
    		{
    			count++;
    		}
    	}
    	
    	if (count % 2 == 1)
    	{
    		isInside = true;
    	}
    
    	return isInside;
    }
    
    
    int main()
    {	
    	//定义一个多边形(六边形)
    	vector<Vec2d> POL;	
    	POL.push_back(Vec2d(268.28, 784.75));
    	POL.push_back(Vec2d(153.98, 600.60));
    	POL.push_back(Vec2d(274.63, 336.02));
    	POL.push_back(Vec2d(623.88, 401.64));
    	POL.push_back(Vec2d(676.80, 634.47));
    	POL.push_back(Vec2d(530.75, 822.85));
    	POL.push_back(Vec2d(268.28, 784.75));				//将起始点放入尾部,方便遍历每一条边
    		
    	//
    	if (Point_In_Polygon_2D(407.98, 579.43, POL))
    	{
    		cout << "点(407.98, 579.43)在多边形内" << endl;
    	}
    	else
    	{
    		cout << "点(407.98, 579.43)在多边形外" << endl;
    	}
    
    	//
    	if (Point_In_Polygon_2D(678.92, 482.07, POL))
    	{
    		cout << "点(678.92, 482.07)在多边形内" << endl;
    	}
    	else
    	{
    		cout << "点(678.92, 482.07)在多边形外" << endl;
    	}
    
    	return 0;
    }

    运行结果如下:

    3. 改进空间

    1. 很多情况下在使用该算法之前,需要一个快速检测的功能:当点不在多边形的外包矩形的时候,那么点一定不在多边形内。
    2. 判断点在线上函数IsPointOnLine()和判断线段相交函数IsIntersect()这里并不是最优算法,可以改成向量计算,效率应该更高。
    展开全文
  • 判断是否在多边形的内部(C#)

    千次阅读 2015-10-13 09:17:02
    判断是否在多边形的内部,适用于任意多边形的方法最常用的就是射线法,即以要判断的点向左或者向右作水平射线,与多边形交点的个数为奇数个时则... /// 判断是否在多边形内. /// ----------原理----------
  • 向量叉乘判断是否在多边形内部

    千次阅读 2020-01-13 09:41:20
    向量叉乘: 二维向量的叉乘 ( x1 , y1 ) * ( x2 , y2 ) = x1y2 - y1x2 如果值大于0 , 则表明 ( x2 , y2 ) ( x1 , y1 )左边,反之右边 ,等于0则...根据上面的规则,可以判断是否在多边形内部: ...
  • 利用鼠标回调函数实现视频上画任意...判断点的算法原理则可参考如下链接的文章,大概意思是从所求点向一个方向引入一条射线,通过射线与多边形相交个数来判断此点是否在多边形内。我不这罗嗦了,直接拿来用。 ...
  • 判断在多边形内,射线和多边形算出奇数个交点,在多边形内
  • 点向某一方向发射射线,如果与多边形的交点个数为奇数,则点在多边形内;如果为偶数,则多边形外。(点多边形上的情况单独计算,不算做多边形内) 问题分解: 子问题1:假设一点C,过C作平行线,找出所有与...
  • 判断是否在任意多边形内 判断方法: 一. 射线判断 过目标点做一条直线(两条反方向的射线),每条射线与多边形边的交点数量都是奇数,则点在多边形内,否则多边形外部; 二.夹角判断 以目标点为顶点,与...
  • c# winform 中实现计算任意多边形面积,包括 凹多边形线段有交叉的多边形等。具体形式如下: 目标:计算红色区域的面积 实现的方法: 1、首先能够鼠标点击事件、鼠标移动事件、和paint事件中实现多边形的...
  • 奇数表示点在多边形内,偶数表示点不在多边形内。 为了简化计算,射线是水平的。 如下图所示: 点 A 水平向右的射线有 5 个交点,奇数,A在多边形内。 点 B 水平向右的射线有 2 个交点,偶数,B 多边形外部...
  • 本文记录一些常见的相交判断方法,属于游戏开发中比较常见的几何...问题,如下图,如何判断线段AB和CD是否相交? 解答:线段之间的相交判断一般使用以下夹持法思路: 1、假如ABC保持现有位置,D可移动,那么穿透...
  • 如何判断一个点是否在多边形内部? (1)面积和判别法:判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。--采纳 (2)夹角和判别法:判断目标点与所有边的夹角和是否为360度,...
  • 下面是:判断是否在多边形内 -- 1使用射线法 以测试点向右或左向无穷点左射线,若射线与多边形交点个数是奇数个,则点内部;若交点个数是偶数个,则点外部;(这里使用左无穷点) -- ...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...矩形是个凸集,所以只要判断所有端点是否矩形中.。 转载于:https://my.oschina.net/1024bits/blog/781237
  • /** * 判断给出的坐标点是否在多边形内 * */ function pointInPolygon(targetPoint, targetPoints) { var leftPointCount = 0; var rightPointCount = 0;//左右点的个数 var _points = []; //第一步:取出所有的点...
  • 其实百度地图中就有判断是否在指定区域的功能,API中提供了相关的方法。但我们不可能不使用地图功能的时候去特地导入BaiDuMap来实现这一功能,所以这里我将改功能的实现提取出自定义一个工具类。 首先...
  • 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点...
  • 判断是否在多边形内的Python实现及小应用(射线法) 转 https://www.jianshu.com/p/ba03c600a557 判断一个点是否在多边形内是处理空间数据时经常面对的需求,例如GIS中的点选功能、根据多边形边界筛选出位于...
  • Qt 判断是否在多边形内

    千次阅读 2017-03-17 14:30:11
    这里不用考虑线段的斜率,不会出现0作除数的bug,因为端点y值与目标点y值相等的时候,会认为端点上面,参考程序中的>=y bool DataConvert::isInsidePoly(const QPointF &iPoint,const QPolygonF &iMyPoly) ...
  • 判断是否在多边形面里面 根据作用的数据性质不同,可以分为:1.基于空间图形数据的分析运算;2。基于非空间属性的数据运算;3.空间和非空间数据的联合运算。空间分析赖以进行的基础是地理空间数据库,其运用的手段...
  • 判断在多边形内算法的C++实现

    千次阅读 2019-04-14 10:31:27
    介绍了使用射线法判断在多边形内部还是外部的算法,并通过C/C++做了具体实现。
  • 判断是否在多边形内(任意多边形) https://blog.csdn.net/u012138730/article/details/79927778 AutoCAD二次开发&判断是否在多边形内部 https://blog.csdn.net/u010608964/article/details/82533064 ....
  • 文章目录判断是否在多边形内1,原理2、右手坐标系3、向量叉积补充知识:可以理解利用向量的叉积,很容易判定一个多边形的凹凸性。也可以判定点是否在多边形的内部。- 判定多边形的凹凸性判断是否在多边形内部 ...
  • python3射线法判断是否在多边形内 射线法 首先我们要先理解什么是射线法。射线法的意思是:随机点上做一条平行于x轴的射线,方向是x轴正方向,看这条射线与多边形区域的交点个数,如果是偶数,那么这个随机点不...
  • 关于点是否在轮廓之,最多的是判断在是否穿过某一顶点的情况,可以列出如下思路:(水平向左 射线) 1、判断点是否在图形范围区间 2、判断点是否在当前直线Y轴范围区间 3、判断点射线跟当前直线的...
  • 前言 原版JS代码参考:面试题:用js检测两个线段是否相交 代码 魔改为C语言后如下: #include <stdio.h>...// 判断两条线段是否相交 float checkCross(float* p1, float* p2, float* p3, fl

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,564
精华内容 3,425
关键字:

判断线段是否在多边形内