首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

用C语言。判断输入的点的坐标在不在多边形里面?该怎么处理

2012-02-13 
用C语言。。判断输入的点的坐标在不在多边形里面?如题。。。多边形的坐标已经输入。。。[解决办法]判断点是否在多

用C语言。。判断输入的点的坐标在不在多边形里面?
如题。。。多边形的坐标已经输入。。。

[解决办法]
判断点是否在多边形中
以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外
,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到
了多边形的内部,遇到第二个交点的时候,离开了多边形,……所以很容易看出当L和多
边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外。
但是有些特殊情况要加以考虑。如果L和多边形的顶点相交,有些情况下交点只能计算一
个,有些情况下交点不应被计算(你自己画个图就明白了);如果L和多边形的一条边重
合,这条边应该被忽略不计。为了统一起见,我们在计算射线L和多边形的交点的时候,
1。对于多边形的水平边不作考虑;2。对于多边形的顶点和L相交的情况,如果该顶点是
其所属的边上纵坐标较大的顶点,则计数,否则忽略;3。对于P在多边形边上的情形,
直接可判断P属于多边行。由此得出算法的伪代码如下:

1. count ← 0;
2. 以P为端点,作从右向左的射线L;
3, for 多边形的每条边s
4. do if P在边s上
5. then return true;
6. if s不是水平的
7. then if s的一个端点在L上且该端点是s两端点中纵坐标较大
的端点
9. then count ← count+1
10. else if s和L相交
11. then count ← count+1;
12. if count mod 2 = 1
13. then return true
14. else return false;


其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数)
,则P和P'就确定了射线L。这个算法的复杂度为O(n)。


PS:建议看看《计算几何》——周培德。。

热点排行