社区
图形处理/算法
帖子详情
求 判断点是否在 凸多边形外的算法 ...
bisc2095
2008-11-03 10:52:51
求 判断点是否在 凸多边形外的算法,好心人给个线索,谢谢。
...全文
301
5
打赏
收藏
求 判断点是否在 凸多边形外的算法 ...
求 判断点是否在 凸多边形外的算法,好心人给个线索,谢谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bisc2095
2008-11-03
打赏
举报
回复
谢谢楼上2位,回答还真快,我去看看,谢谢了。
laolaoliu2002
2008-11-03
打赏
举报
回复
N个点组成的多边形内,构建一个Region
region.IsVisible(point);//返回bool
laolaoliu2002
2008-11-03
打赏
举报
回复
1. 叉乘判别法(只适用于凸多边形)
想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断结果3维矢量中Z分量的符号是否发生变化,进而推导出点是否处于凸多边形内外。这里要注意的是,多边形顶点究竟是左手序还是右手序,这对具体判断方式有影响。
2. 面积判别法(只适用于凸多边形)
第四点分别与三角形的两个点组成的面积分别设为S1,S2,S3,只要S1+S2+S3>原来的三角形面积就不在三角形范围中.可以使用海伦公式 。推广一下是否可以得到面向凸多边形的算法?(不确定)
3. 角度和判别法(适用于任意多边形)
double angle = 0;
realPointList::iterator iter1 = points.begin();
for (realPointList::iterator iter2 = (iter1 + 1); iter2 < points.end(); ++iter1, ++iter2)
{
double x1 = (*iter1).x - p.x;
double y1 = (*iter1).y - p.y;
double x2 = (*iter2).x - p.x;
double y2 = (*iter2).y - p.y;
angle += angle2D(x1, y1, x2, y2);
}
if (fabs(angle - span::PI2) < 0.01) return true;
else return false;
另外,可以使用bounding box来加速。
if (p.x < (*iter)->boundingBox.left ||
p.x > (*iter)->boundingBox.right ||
p.y < (*iter)->boundingBox.bottom ||
p.y > (*iter)->boundingBox.top) 。。。。。。
对于多边形来说,计算bounding box非常的简单。只需要把水平和垂直方向上的最大最小值找出来就可以了。
对于三角形:第四点分别与三角形的两个点的交线组成的角度分别设为j1,j2,j3,只要j1+j2+j3>360就不在三角形范围中。
4. 水平/垂直交叉点数判别法(适用于任意多边形)
注意到如果从P作水平向左的射线的话,如果P在多边形内部,那么这条射线与多边形的交点必为奇数,如果P在多边形外部,则交点个数必为偶数(0也在内)。所以,我们可以顺序考虑多边形的每条边,求出交点的总个数。还有一些特殊情况要考虑。假如考虑边(P1,P2),
1)如果射线正好穿过P1或者P2,那么这个交点会被算作2次,处理办法是如果P的从坐标与P1,P2中较小的纵坐标相同,则直接忽略这种情况
2)如果射线水平,则射线要么与其无交点,要么有无数个,这种情况也直接忽略。
3)如果射线竖直,而P0的横坐标小于P1,P2的横坐标,则必然相交。
4)再判断相交之前,先判断P是否在边(P1,P2)的上面,如果在,则直接得出结论:P再多边形内部。
Kudeet
2008-11-03
打赏
举报
回复
MFC的类里面可以直接用PtInRegion方法,
如果完全自己判断则参考
http://www.cppblog.com/w2001/archive/2008/09/23/31694.html
laolaoliu2002
2008-11-03
打赏
举报
回复
通过拓扑映射,点在凸多边形内外的判别可以转化为映射点在射影直线上的位置关系问题
判断
点
是否
在
凸多边形
内
方法实际有很多,例如 (1)面积和判别法:
判断
目标
点
与多边形的每条边组成的三角形面积和
是否
等于该多边形,相等则在多边形内部。 (2)夹角和判别法:
判断
目标
点
与所有边的夹角和
是否
为360度,为360度则在多边形内部。 (3)引射线法:从目标
点
出发引一条射线,看这条射线和多边形所有边的交
点
数目。如果有奇数个交
点
,则说明在内部,如果有偶数个交
点
,则说明在
外
部。 这里我看到一种比较简单的方法,对于...
判断
一个
点
是否
在
凸多边形
中--C++
判断
一
点
是否
在四边形中欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用M...
判断
点
在
凸多边形
內
判断
点
在
凸多边形
內
判断
点
在
凸多边形
内的
算法
有很多,可以参考链接3,个人尝试使用了同侧法,此处也只解析这个方法
算法
原理: 同侧法是
判断
点
在向量哪一侧的一个方法,这个
算法
的概念是来自于参考文献一,参考文献一
判断
的是
点
在三角形内。 通过对这个
算法
的尝试,发现这个
算法
完全可是适用于任意
凸多边形
。
判断
点
在多边形内的设计思路也很简单,就是将
凸多边形
想象成首位相连方向都是顺时针或者是逆时针的一组向量(一定是AB,BC,CA,如下图,一定不能出现AB,BC,AC这种向量首尾不能衔接的情况),被
凸多边形
.
【计算几何】凸多面体重叠
判断
算法
:GJK
算法
详解 & C++代码实现二维情形的
凸多边形
重叠
判断
GJK
算法
是由 Gilbert,Johnson,Keerthi 三位前辈发明的,用来计算两个凸多面体之间的碰撞检测,以及最近距离。GJK
算法
可以在OMNO(M+N)OMN的时间复杂度内,检测出碰撞,
算法
在每次迭代的过程中,都会优先选择靠近原
点
的方向,因此收敛速度会很快。
算法
的证明过程比较复杂,但是原理还是比较容易理解的。GJK的初衷是确定两个凸包之间的距离。GJK还可以用于在小距离穿透情况下获取碰撞信息,并可以通过其他
算法
进行补充以实现更大距离的穿透。通过随机的方式获取初始方向。
判断
点
是否
在给定四边形内的
算法
注意:凹
凸多边形
的定义
凸多边形
:每个内角都是锐角或钝角,也就是没有大于180°的优角的多边形。 凹多边形:至少有一个优角的多边形。
凸多边形
就是把一个多边形任意一边向两方无限延长成为一条直线,如果多边形的其他各边均在此直线的同旁,那么这个多边形就叫做
凸多边形
,也可以理解为通过
凸多边形
的任意一条边作平面,并与此多边形所在的平面相异,那么
凸多边形
的其他所有部分都在所作平面的同一侧。 凹多边形就...
图形处理/算法
19,464
社区成员
50,678
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章