游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10525|回复: 11

请问怎么判断一个点是否在多边形之内?

[复制链接]

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-7-10 14:12:00 | 显示全部楼层 |阅读模式
如果有具体的算法请帮帮忙~感激...

15

主题

248

帖子

248

积分

中级会员

Rank: 3Rank: 3

积分
248
发表于 2005-7-10 17:40:00 | 显示全部楼层

Re:请问怎么判断一个点是否在多边形之内?

点坐标带入多边形方程,结果=0,在多边形边上,<0在多边形内,>0在多边形外。(适用于2D,3D一般不会去这样判断,因为这样要先投影,很麻烦)

9

主题

45

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2005-7-11 01:07:00 | 显示全部楼层

Re:请问怎么判断一个点是否在多边形之内?

  我觉得可以把多边形变成N个矩形,当然这是针对2D的情况;这要求一开始对多边形的描述就是由N个矩形组成的,可以用标志设置矩形的哪条边才是多边形的边,然后对点进行是否在某个矩形的判断,速度很快。反正我的一个作品(2D 引擎)就是这样实现对边界的检测和对碰状的检测

18

主题

579

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2005-7-11 10:22:00 | 显示全部楼层

Re:请问怎么判断一个点是否在多边形之内?

能说的详细点吗?三维空间的多边形还是二维空间的。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-11 10:50:00 | 显示全部楼层

Re:请问怎么判断一个点是否在多边形之内?

我晕阿,怎么老是这种问题,平面下判断点是否在多边形内,可以使用射线法,具体算法可以查看有关GIS的资料,专门研究这个的。

三维多边形?点在三维多边形内?没有这种问题吧,那也是点在多面体中不是多边形,依然可以使用射线法。

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2005-7-11 13:50:00 | 显示全部楼层

请问怎么判断一个点是否在多边形之内?

对不起,我说的是2D的情况下,之前没说清楚~Sorry.


Carl: Re:请问怎么判断一个点是否在多边形之内?
点坐标带入多边形方程,结果=0,在多边形边上,<0在多边形内,>0在多边形外。(适用于2D,3D一般不会去这样判断,因为这样要先投影,很麻烦)

多边形方程?不太明白啊...


ricyangliu: Re:请问怎么判断一个点是否在多边形之内?

  我觉得可以把多边形变成N个矩形,当然这是针对2D的情况;这要求一开始对多边形的描述就是由N个矩形组成的...


这个好像有些局限性,我觉得不太好.

bigbook2000: Re:请问怎么判断一个点是否在多边形之内?

我晕阿,怎么老是这种问题,平面下判断点是否在多边形内,可以使用射线法,具体算法可以查看有关GIS的资料,...


兄弟有详细些的资料么,我被这个问题困了一个星期了。你说的射线法是指什么呢?

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2005-7-11 13:59:00 | 显示全部楼层

Re:请问怎么判断一个点是否在多边形之内?

射线法:从该点做向左或向右的射线,如果射线与多边形有奇数个交点,则该点在多边形内,同时要注意交点被多边形两条边共享的情况以及射线与边重合的问题

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2005-7-11 14:24:00 | 显示全部楼层

Re:请问怎么判断一个点是否在多边形之内?

多谢了,这和我的想法有些相似,等会我把自己的思路写出来,有几个难点我始终解不出。

15

主题

248

帖子

248

积分

中级会员

Rank: 3Rank: 3

积分
248
发表于 2005-7-11 23:45:00 | 显示全部楼层

Re:请问怎么判断一个点是否在多边形之内?

射线法不一定好用吧……(我没用过,所以不知道)
//多边形A(X1,Y1),B(X2,Y2),C(X3,Y3)
//点F(X,Y)
//斜率
Kab = (Y1-Y2)/(X1-X2),     Kac = (Y1-Y3)/(X1-X3),    Kbc = (Y2-Y3)/(X2-X3),
Kaf = (Y1-Y)/(X1-X),     Kcf = (Y3-Y)/(X3-X)
bool PointPosition(float Kab,float Kac,float Kbc,float Kaf,float Kcf)
{
if(Kab>Kac) {if((Kab<Kaf)&&(Kac>Kaf)) return false;} else {if((Kab>Kaf)&&(Kac<Kaf)) return false;} //判断AF的斜率是否在AB和AC的斜率之间,如果不是,返回false
if(Kbc>Kac) {if((Kbc<Kcf)&&(Kac>Kcf)) return false;} else {if(Kbc>Kcf)&&(Kac<Kcf)) return false;} //判断CF的斜率是否在AC和BC的斜率之间,如果不是,返回false
//如果AF的斜率在AB和AC之间,并且CF的斜率在AC和BC之间,就说明点F在多边形ABC之内
return true;
}//这样做应该可以吧……

PS:以上是我自己想的,5次计算+最多6次判断不算太麻烦吧……关键是都是以“点”的形式作为输入,对于空间多边形比较方便,而且不用考虑Z值(当作是XY平面的投影),前提是先判断是否垂直于某平面,如果是就投影到其他平面,呵呵

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-7-21 02:46:00 | 显示全部楼层

Re: 请问怎么判断一个点是否在多边形之内?

射线法不一定好用吧……(我没用过,所以不知道)


没什么好争论的,计算机下判断点在多边形内矢量计算就是用射线法,这是经典算法,没用过可以找一本拓扑学的书自己看。

你一个简单的三角形,做了10次减法运算,5次除法运算(还不考虑除数为零的情况),6次比较判断,这还不算复杂?如果是N边形你自己看看要多少运算。

对于形态比较好的N多边形,射线法只需要做N*2次比较判断和2次减法运算和1次除法运算,最极端的情况才和你差不多。

之所以有射线法,是因为当时计算机不是很发达,尽量避免除法和乘法运算是当时大多数算法模型首先考虑的。很多经典算法都是这样的,比如我们以前学习C语言用点绘制直线和圆的时候的情形就是如此


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 01:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表