c#判断点在多边形内

lunhuaboys 2008-05-07 11:26:10
如题,这个怎么判断阿,请求解决方案。
...全文
3730 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackruan1 2011-10-31
  • 打赏
  • 举报
回复
JerryLia 2011-02-17
  • 打赏
  • 举报
回复
用颜色遮罩的方法没有7楼的效率高。
dylike 2010-05-07
  • 打赏
  • 举报
回复
常见的比如黑色块遮罩,只要判断目标点是否是黑色,则表示该点是否在区域内!当然另一种方法是Contains,从速度上来说,这两种比上面的几种数学计算要快得多.
dylike 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 yuwenge 的回复:]
用黑色Fill这个多边形的path在一个bitmap上,然后获取该点在bitmap上的颜色,黑色就在多边形内,无色就在多边形外。

我觉得这个方法比数学方法要快,谁没事有空去测试下。
[/Quote]

正解!计算机图形就有数学图形不具备的优势!
zhoujk 2010-05-06
  • 打赏
  • 举报
回复
我刚才说的这种向内折返的多边形会导致算法1和2出错
zhoujk 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yatobiaf 的回复:]
我知道在图形学中有三个方法:
1,面积法。就是看所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则在内部。反之在外部。这种方法计算量较大,用到的主要计算是查乘。
2,夹角和法。参见三楼,判断所有边和目标点的夹角和是否为360度。计算量比上面这种方法稍微小点,用到主要是点乘和求模计算。
3,引射线法。就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。这是所有方法中计算量最小的方法,在光线追踪算法中有大量的应用。
[/Quote]
以当前点为起点O,连接3个相邻的点ABC,角度以顺时针方向的为准,如果角AOB为正但是角BOC为负,也就是说C点向内折返,那么算法1和2就会出错吧?只要线OB>线OC,这种折返的多边形就是成立的。
3.应该是正确的,但是应该这么表述:从当前点连接每个顶点,形成条线段,计算这些线段与所有边的交点数目,如果其中有一条线的交点数目为偶数,则当前点在外部。否则在内部。还有另外一个问题,如果当前点与某个顶点重合,或者如果当前点不与任何顶点重合,但是在某条边线上,则返回一个特殊的值
丷丩 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yagebu1983 的回复:]

用点,对角线分割多边形为三角形!!
求三角形面积,比较三角形面积!!
[/Quote]
这个有点复杂~
xiaohi22 2010-04-02
  • 打赏
  • 举报
回复
若判断点是否在不规则的封闭曲线中呢?
mowensky 2010-01-13
  • 打赏
  • 举报
回复
标记学习
卧_槽 2010-01-13
  • 打赏
  • 举报
回复
用黑色Fill这个多边形的path在一个bitmap上,然后获取该点在bitmap上的颜色,黑色就在多边形内,无色就在多边形外。

我觉得这个方法比数学方法要快,谁没事有空去测试下。
fut20090715 2010-01-13
  • 打赏
  • 举报
回复
16L总结的很全面
顶一个
liyongjiwang 2010-01-13
  • 打赏
  • 举报
回复
7楼的才是正确的方法~~~~GOOD
denbes 2009-01-15
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yatobiaf 的回复:]
我知道在图形学中有三个方法:
1,面积法。就是看所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则在内部。反之在外部。这种方法计算量较大,用到的主要计算是查乘。
2,夹角和法。参见三楼,判断所有边和目标点的夹角和是否为360度。计算量比上面这种方法稍微小点,用到主要是点乘和求模计算。
3,引射线法。就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内…
[/Quote]
好的归纳
7楼为具体在C#的处理
超级大笨狼 2009-01-15
  • 打赏
  • 举报
回复
这个问题属于算法几何的范围

引一个x轴射线,如果和边的交点是单数就在里边,偶数在外

判断相交,容易,只要线段的两头分别在射线的上下就是相交.
yhy0611 2009-01-15
  • 打赏
  • 举报
回复
我曾经发过这样的贴子,因为使用.net自带的类得到的结果很不理想,里面有位高人帮我写了,你可以参考一下
http://topic.csdn.net/u/20080912/14/1e9b4e1a-cd43-4800-a552-e6da6a95e924.html
null1 2009-01-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Mittermeyer 的回复:]
将多边形生成一个封闭路径,然后用GraphicsPath.IsVisible判断点是否在封闭路径的区域内。
具体看可以看MSDN中GraphicsPath 类的说明。
[/Quote]

7楼是实现
cwmwss 2009-01-15
  • 打赏
  • 举报
回复
openGL里这个很多!你是要画图?
Ador3 2008-06-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huang_8228 的回复:]
算法:

判断一个点是否在多边形里面只要判断该点与所有的相邻两个顶点组成的三角形的以该点为顶点的角的和是否等于360°,不等于360°的就不是在多边形里面的。现在手头没有代码,要的话我找来给你。
[/Quote]
思考中....
yatobiaf 2008-06-27
  • 打赏
  • 举报
回复
我知道在图形学中有三个方法:
1,面积法。就是看所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则在内部。反之在外部。这种方法计算量较大,用到的主要计算是查乘。
2,夹角和法。参见三楼,判断所有边和目标点的夹角和是否为360度。计算量比上面这种方法稍微小点,用到主要是点乘和求模计算。
3,引射线法。就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。这是所有方法中计算量最小的方法,在光线追踪算法中有大量的应用。

在C#中的话,有一个Region类,可以直接调用IsVisible判断是否在这个区域内部,我估计内部的实现应该是上面说的第三种方法。主要看你的需求是哪种输入了,如果在C#中,你完全可以用Region类来隐藏内部实现。
parfum 2008-06-27
  • 打赏
  • 举报
回复
记得这是图形学的算法内容,都忘了
加载更多回复(14)

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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