判断点及线段是否在多边形内
来源:互联网 发布:看新闻联播的软件 编辑:程序博客网 时间:2024/06/06 16:36
昨天小学了一点计算几何学的内容,想把它记下来,以便以后翻阅。
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
;
0 0
- 判断点及线段是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断一个点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断某个点是否在多边形内
- zoj1081判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- 判断点是否在多边形内
- Java 数组工具类排序,最大值最小值等
- android:password is deprecated: Use inputType instead
- 中国码农在硅谷
- solr cloud log
- ie6下div的width会被padding撑开的解决思路
- 判断点及线段是否在多边形内
- logger 日志级别
- 删除表空间时报ORA-12919
- 数据流重定向(鸟哥的私房菜基础篇第三版)
- 远程桌面工具 mRemote
- mysql笔记1
- Aptana Studio
- 送给20多岁的你
- 锤子手机2014发布会视频