| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11316 人关注过本帖
标题:如何判断一个点是否在多边形区域内~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:20 
如何判断一个点是否在多边形区域内~
最近做游戏要用到关于这个知识~高数不好~伤脑筋~

给定多边形的n个顶点坐标(x1,y1),(x2,y2),(x3,y3)……(xn,yn)按顺序相连组成一个多边形(不考虑连线过程出现相交而把多边形分割的情况)~
和已知点(x,y)
如何判断该点是否在多边形区域内?~

感觉可以分成多个三角形来判断~但问题时怎么判断该点是否在一个三角形区域内呢~

最好有一个完整的代码~~~~~~

[此贴子已经被作者于2017-4-2 22:59编辑过]

搜索更多相关主题的帖子: 知识 游戏 如何 三角形 最好 
2017-04-02 22:49
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
单个三角形求解好做~但感觉难点在于多边形可能是不规则的~任意三点连成的三角形不一定在多边形区域內~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-02 23:14
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:5 
多边形  是 凹 的 还是 凸的

如果是凸的 应该可以根据  求点 (x,y)的 水平 和 垂直 线

与多边形的 交点数量

2、3个交点的 在顶点、边上

4个交点的  可根据交点的范围进行判定; (x,y1) ,(x,y2), (x3,y),(x4,y)

当 y1 > y2,  x1 > x2, 如果 y1 > y > y2, x1 > x > x2 则在多边形内



不在上面条件中的  就不在(凸)多边形中,  时间复杂度为O(n)  n为边的数量
2017-04-02 23:39
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
高数是 大学的吧

这个好像是初中的 二元一次方程,  属于几何?
2017-04-02 23:49
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 寒风中的细雨
凸的我试试应该可以求解~但感觉如果是凹的则比较复杂了~
解到凸的现在已经够用了~也算可以过吧~但如果能找到凹多边形(任意多边形)的解法就更好了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-02 23:51
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 寒风中的细雨
多谢指点突然明白如何求解凸多边形了
思路就是把每一条边的两点一元方程式列出来~然后就作水平线和垂直线(其实只要不重合的就可以行得通了)~

先判断该点是否在某直线(含取值范围)上~
如果在则在边界上~
如果不在~

如果有一条直线连续经过两个点则不在该凸多边形里面~

如果小于4个交点则不在该凸多边形里面~

如果有4个交点~

则如果((x1-x)*(x2-x)<0)&&((y1-y)*(y2-y)<0)则在凸多边形里面~
否则不在凸多边形里面~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-03 00:15
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:15 
回复 5楼 九转星河
通用的

列举垂直方向的 交点  假设  与 m 条线段有交点 m 个  交点分别为(x, y1),(x,y2) 。。。 (x, ym)

通过 排序 可以满足  y1 < y2 < ... < ym

现在就是区分 (x, y1) 到 (x, y2)之间这段, 即相邻的2点连线 是否需要范围内还是外

可以给这些排好序的交点 加上一个附加属性, 方向性,   例如, 第一个顶点(x, y1)  当 (x, y1) 不属于 多边形的顶点 则方向定位
外->内,  当 (x,y1)属于多边形的顶点 则方向定为(顶点); 第二个顶点(x,y2) 当(x, y2)不属于 多边形的顶点 则方向定位,依赖前一个(x,y1)
的方向, 如果(x, y1)为 外->内, 则(x, y2)定位 内到外, 否则定为 外->内, 如果(x,y2)属于多边形的顶点,则方向定位(顶点);


总结, 交点的方向是交替的 先是(外->内) 然后 再是 (内->外) ,这样子循环的, 但是  这些属性的交点间 可以随意穿插 交点方向为(顶点) 的点。
   然后就是方向的识别(两点连线是否属于多边形范围内)   
  1、(外->内) 连 (内->外) 属于 范围内
  2、(外->内) 连 (顶点)  属于 范围内
  
  3、 (顶点)连 (顶点) 属于范围 依赖 上次识别的范围属性 如果 没有上次的状态  即为(表示 第一个和第二个点都是 顶点) 范围外
  4、 (顶点)连 (外->内) 属于范围外
  5、 (顶点)连 (内->外) 属于方位内

  6、 (内->外)连 (外->内) 属于 范围外
  7、 (内->外)连 (顶点) 属于 范围外


然后就是进行 y 范围的对比了。 y 落在什么范围就是 就可以直接看出这个点属不属于 多边形的范围了

[此贴子已经被作者于2017-4-3 00:41编辑过]

2017-04-03 00:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 7楼 寒风中的细雨
我还是先去看看凸多边形~
感觉6楼的思路还可以优化~
凸多边形的一个重要的性质是:
过凸多边形上的任意一个顶点作任意一条不与边界重合的直线最多把该多边形分割成两个部分~

所以判断凸多边形的方法就可以变得很简单了~
先判断该点在不在边界上~
如果不在~
作一条垂直x轴的直线~判断交点个数~

如果有两个交点纵坐标为y1,y2并满足(y1-y)*(y2-y)<0这个条件就行了~

凹多边形我还是要慢慢理解一下~

[此贴子已经被作者于2017-4-3 02:12编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-03 01:36
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 7楼 寒风中的细雨
我现在也能理解凹多边形了~就像你说的,作一条垂直的直线然后判断交点个数~
先判断该点是否在边界上~
如果不在~
先把坐标刚好在顶点上而且连接顶点的两条线段在直线的同侧这种特殊情况的顶点排除掉~
如果该直线刚好与两个顶点之间的连线重合则取其中一个顶点~

得到点y1,y2,y3……yn~

然后对y1,y2,y3……yn和y
进行排序~

看看y的排位是多少~
设y的排位是i(i从下标1开始)~
如果y的排位是偶数则在多边形里面~
否则就在多边形外面~

PS:实际上排序还可以简化一下~取相邻的两个点x1,x2~如果(x1-x)*(x2-x)<=0并且该顶点相连的两条直线不在同侧0则记录该两个交点是否在直线的上方~最后看看上方个数是否为偶数就行了~

[此贴子已经被作者于2017-4-3 03:03编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-04-03 02:10
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
说的比唱的好听,代码实现呢?
仔细想来,纯凸的封闭多边形好判断,只要判断该点与其他顶点的连线是否与多边形的某条边是否相交,未与任何边相交则在多边形内,否则在外。
如果是非常变态的凹多边形,如一个螺旋的封闭多边形,则判断相交则实在麻烦,我能想到的算法是在最小区域矩形框内从要判断的点开始着色,如果着色过程中碰到矩形边框则说明该点在多边形外面,如果着色完成都碰不到矩形边框,则说明在多边形内。
矩形区域内着色就是深度搜索算法,考虑栈空间,也可用堆空间的广度搜索。
2017-04-03 07:58
快速回复:如何判断一个点是否在多边形区域内~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016502 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved