判断一个点是否落在一个图形内

dreamseekers 2000-05-03 05:21:00
假如有一个不太规则的图形(该图形的边缘的点能知道),我用鼠标点击一下,我该如何
去得知该点中的点是在图形内还是在图形外?
...全文
1090 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
prefix 2000-08-08
  • 打赏
  • 举报
回复
我看你要先得到该点的x,y,然后在x,y上查找你已知那个不规则图形的点看看有没有一个点的x大于(或小于,看你的x,y方向如何定义)该点的x,另一个点(或还是上一个点都行)的y大于该点的y(或小于,看你的x,y方向如何定义)就可以知道了
trivita 2000-07-10
  • 打赏
  • 举报
回复
前面的算法都很对,
我只是想说如果你是写游戏,
不是必须精确判断的,可以用简单图形近似该区域。

但如果你是作图象处理,那就不得不采用前面的算法了
Bobby 2000-06-21
  • 打赏
  • 举报
回复
我还有个方法,原理大同小异,对凸多边形特别快,对凹多边形无效。以三角形为例:
v1,v2,v3,三个顶点

算出直线 v1,v2 为 Ax+By+C=0; 得到函数f(x,y)=Ax+By+C
v2,v3为 Ex+Fy+G=0; 得到函数f(x,y)=Ex+Fy+C
v3,v1为 Hx+Iy+J=0; 得到函数f(x,y)=Hx+Iy+J
注意f(x,y)=Ax+By+C 和 f(x,y)=-Ax-By-C是不同的函数,虽然他们对应的直线方程相同,符号取值要看两顶点的先后顺序,也就是说求三个直线函数时取点要按同一方向(顺时针或逆时针),琢磨一下就能解决。
把待测点代入三个函数,若任一结果为零,或三值同号,则测点在多边型内部。

bobby
netkid 2000-06-19
  • 打赏
  • 举报
回复
若是椭圆(知道其外接矩形)又如何判断?
geofee 2000-06-19
  • 打赏
  • 举报
回复
如果你需要判断的图形目标很少,你可以采用Window 的 Region 来判断。
但是如果你需要判断的图形目标很多,Region判断就会很慢,且浪费内存。

一般采用垂线法,在垂线法中要注意处理垂线恰好通过区域顶点的情况。另外
是角度法,即判断从点到顶点的角度和是否为360度。两者均可。

算法的快慢在于交叉计算的量,以及角度的计算方法。
在进行判断前先因该进行区域最外围矩形包含判断。这样省去许多没有必要的计算。

ad 2000-06-14
  • 打赏
  • 举报
回复
我的程序中恰好有这样的算法,我是这样做的:
1、要判断的区域是一个封闭多边形,凹多边形也可以;
2、计算多边形的正规外接矩形;
3、若点在矩形外,肯定不在多边型内,判断结束;
4、从点向矩形任一顶点作射线,求该射线与多边形所有边的相交情况,焦点是多边形顶点时要考虑顶点关联的两条边与射线的关系:在射线同侧不认为相交,在射线两侧认为相交;
5、有奇数个焦点则点落在多边形内,否则在多边形外。
sxldl 2000-05-31
  • 打赏
  • 举报
回复
使用Windows API吧
YYboy 2000-05-26
  • 打赏
  • 举报
回复
计算多边形的最大尺寸范围m*n, 以该点为起点引出一长度为2*max(m, n) 的线段
计算该线段与多边形的交点总数(注意, 必须处理线段刚好通过该多边形端点和
与多边形一边重叠情况, 如当线段刚好通过该多边形端点时, 如果相邻两端点在
线段异侧, 记交点数为1, 同侧则记交点数为0或2, 最后计算总交点数, 如果为奇数,
则点在多边形内. 注意, 线段的延伸方向应进行优化以提高效率和精确度. 该算法
精确度极高, 效率也不错, 已成功运用与CAD




mjyf 2000-05-26
  • 打赏
  • 举报
回复
YYboy是对的
茂奇软件 2000-05-25
  • 打赏
  • 举报
回复
Make a polygon rgn by CreatePolygonRgn.
test it by PtInRegion
mjyf 2000-05-24
  • 打赏
  • 举报
回复
从该点引向任意方向引一条射线,求出该射线同不规则闭合图形边缘交点数,偶数在图形外,奇数在图形内.
x86 2000-05-24
  • 打赏
  • 举报
回复
计算机图形学中就有好几个算法,大学学过的,不过忘了
找本书看看吧
zroc 2000-05-19
  • 打赏
  • 举报
回复
99年某一期《电脑爱好着》《请你编程》里有一题是求一个点是否在一个多边形内,原理与回复人 jll 的第二种方法的原理一样。里面有原理、方法和具体实现的C代码。如果你找不到,可以与我联系(zroc@163.net)。
还有一种方法,有点类似回复人 zoulijun 的方法,但却是用矢量原理:一个闭合多边形所有边按同一方向(顺时针或逆时针)的矢量和为零。实现方法是:先求出待求点与多边形 n 个顶点的按顺序的矢量(顺时针或逆时针)s0、s1、s2 ---- s(n-1),如果表达式(s1-s0)+(s2-s1)+(s3-s2)+ ---- +(s(n-1)-s(n-2))+(s0-s(n-1)) 的值为零,说明点在多边形内。
两种方法判断速度都非常快,足以满足游戏对速度的需求,老兄要用更不因该有问题。
zroc 2000-05-19
  • 打赏
  • 举报
回复
99年某一期《电脑爱好着》《请你编程》里有一题是求一个点是否在一个多边形内,原理与回复人 jll 的第二种方法的原理一样。里面有原理、方法和具体实现的C代码。如果你找不到,可以与我联系(zroc@163.net)。
还有一种方法,有点类似回复人 zoulijun 的方法,但却是用矢量原理:一个闭合多边形所有边按同一方向(顺时针或逆时针)的矢量和为零。实现方法是:先求出待求点与多边形 n 个顶点的按顺序的矢量(顺时针或逆时针)s0、s1、s2 ---- s(n-1),如果表达式(s1-s0)+(s2-s1)+(s3-s2)+ ---- +(s(n-1)-s(n-2))+(s0-s(n-1)) 的值为零,说明点在多边形内。
两种方法判断速度都非常快,足以满足游戏对速度的需求,老兄要用更不因该有问题。
always 2000-05-17
  • 打赏
  • 举报
回复
If you can use api,then you can create a region with the edge points,
then you use PtInRgn to justify the point is in or out.
LD 2000-05-13
  • 打赏
  • 举报
回复
非凸多边形有办法吗?
小弟的凸多边形被大卸八块后已经惨不忍睹了。
zoulijun 2000-05-10
  • 打赏
  • 举报
回复
如果外边用多边形近似的话, 刚可用:
将此点与多边形的各顶点连线, 然后求和线12, 23, 34, ..., n1夹角.
若和为360度, 则点在多边形内. 若为0 , 则在多边形外.
jll 2000-05-03
  • 打赏
  • 举报
回复
判断该鼠标点击处的点的颜色是否和图形外一致,如果一致就在图形外,否则就在图形内。
如果图形内外颜色是一致的,就必须用图形学中的方法了!
从该点画两条直线,互相垂直,如果从该点向四个方向(上下左右)的直线与图形的边缘有奇数个(通常是1个)焦点就说明该点在图形内,否则就在图形外……

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧