当前位置:编程学习 > C#/ASP.NET >>

c#判断点在多边形内

如题,这个怎么判断阿,请求解决方案。 --------------------编程问答-------------------- http://mniwjb.blog.sohu.com/58905924.html --------------------编程问答--------------------

//一个矩形,如果位置大小是一个控件的,可以 Rectangle rect = Control.Bounds
Rectangle rect = new Rectangle(0, 0, 100, 100); 
Point testPoint1 = new Point(50, 60);
rect.Contains(testPoint1);//在矩形里面,返回true

Point testPoint2 = new Point(110,20);
rect.Contains(testPoint2);//不在矩形里面,返回false
--------------------编程问答-------------------- 算法:

判断一个点是否在多边形里面只要判断该点与所有的相邻两个顶点组成的三角形的以该点为顶点的角的和是否等于360°,不等于360°的就不是在多边形里面的。现在手头没有代码,要的话我找来给你。 --------------------编程问答-------------------- 将多边形生成一个封闭路径,然后用GraphicsPath.IsVisible判断点是否在封闭路径的区域内。
具体看可以看MSDN中GraphicsPath 类的说明。
--------------------编程问答-------------------- 学GIS的吧
我用C++写过这个算法 --------------------编程问答--------------------
引用 3 楼 huang_8228 的回复:
算法: 

判断一个点是否在多边形里面只要判断该点与所有的相邻两个顶点组成的三角形的以该点为顶点的角的和是否等于360°,不等于360°的就不是在多边形里面的。现在手头没有代码,要的话我找来给你。


好方法 --------------------编程问答--------------------


System.Drawing.Drawing2D.GraphicsPath   myGraphicsPath=new System.Drawing.Drawing2D.GraphicsPath();     Region myRegion=new Region();             
myGraphicsPath.Reset();   


//添家多边形点      
                           Point p1=new Point(x1,y1);
                        Point p2=new Point(x2,y2);
                        Point p3=new Point(x3,y3);
                        Point p4=new Point(x4,y4);


myGraphicsPath.AddPolygon(LoadPoint(p1,p2,p2,p4));  
myRegion.MakeEmpty();   
myRegion.Union(myGraphicsPath);   
 //返回判断点是否在多边形里
bool myPoint myRegion.IsVisible(MousePoint);          
--------------------编程问答-------------------- 算法:
对多边形进行图的遍历,得到多边形所有像素点的坐标数组。
判断点坐标是否在该数组内。 --------------------编程问答-------------------- 不错 --------------------编程问答-------------------- 用点,对角线分割多边形为三角形!!
求三角形面积,比较三角形面积!!
--------------------编程问答-------------------- 怎么样交互画以任意多边形,并存储所画多边形的顶点坐标,存储在多边形内的点 --------------------编程问答-------------------- baidu 计算几何算法概览 --------------------编程问答-------------------- Mittermeyer  和zgke 
我用你们说的方法画了一多边形,然后举例了两个点判断他们是否在所绘制的多边形内,但是结果是错误的,不知道为什么,本来两个点都在里边,但是结果只有一个在里边,当我用一个点测试时,他的结果是正确的,本来在里边就在里边,不再里边就不在。
查了很多遍不知道为什么,麻烦你们谁能帮我看看呢 ? --------------------编程问答--------------------
引用 4 楼 Mittermeyer 的回复:
将多边形生成一个封闭路径,然后用GraphicsPath.IsVisible判断点是否在封闭路径的区域内。 
具体看可以看MSDN中GraphicsPath 类的说明。 

嗯,这个方法,我也看看。 --------------------编程问答-------------------- 记得这是图形学的算法内容,都忘了 --------------------编程问答-------------------- 我知道在图形学中有三个方法:
1,面积法。就是看所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则在内部。反之在外部。这种方法计算量较大,用到的主要计算是查乘。
2,夹角和法。参见三楼,判断所有边和目标点的夹角和是否为360度。计算量比上面这种方法稍微小点,用到主要是点乘和求模计算。
3,引射线法。就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。这是所有方法中计算量最小的方法,在光线追踪算法中有大量的应用。

在C#中的话,有一个Region类,可以直接调用IsVisible判断是否在这个区域内部,我估计内部的实现应该是上面说的第三种方法。主要看你的需求是哪种输入了,如果在C#中,你完全可以用Region类来隐藏内部实现。 --------------------编程问答--------------------
引用 3 楼 huang_8228 的回复:
算法: 

判断一个点是否在多边形里面只要判断该点与所有的相邻两个顶点组成的三角形的以该点为顶点的角的和是否等于360°,不等于360°的就不是在多边形里面的。现在手头没有代码,要的话我找来给你。

思考中.... --------------------编程问答--------------------
引用 16 楼 yatobiaf 的回复:
我知道在图形学中有三个方法: 
1,面积法。就是看所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则在内部。反之在外部。这种方法计算量较大,用到的主要计算是查乘。 
2,夹角和法。参见三楼,判断所有边和目标点的夹角和是否为360度。计算量比上面这种方法稍微小点,用到主要是点乘和求模计算。 
3,引射线法。就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内…

好的归纳
7楼为具体在C#的处理 --------------------编程问答--------------------
引用 4 楼 Mittermeyer 的回复:
将多边形生成一个封闭路径,然后用GraphicsPath.IsVisible判断点是否在封闭路径的区域内。 
具体看可以看MSDN中GraphicsPath 类的说明。 


7楼是实现 --------------------编程问答-------------------- 我曾经发过这样的贴子,因为使用.net自带的类得到的结果很不理想,里面有位高人帮我写了,你可以参考一下
http://topic.csdn.net/u/20080912/14/1e9b4e1a-cd43-4800-a552-e6da6a95e924.html --------------------编程问答-------------------- 这个问题属于算法几何的范围

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

判断相交,容易,只要线段的两头分别在射线的上下就是相交. --------------------编程问答-------------------- openGL里这个很多!你是要画图? --------------------编程问答-------------------- 7楼的才是正确的方法~~~~GOOD --------------------编程问答-------------------- 16L总结的很全面
顶一个 --------------------编程问答-------------------- 用黑色Fill这个多边形的path在一个bitmap上,然后获取该点在bitmap上的颜色,黑色就在多边形内,无色就在多边形外。

我觉得这个方法比数学方法要快,谁没事有空去测试下。 --------------------编程问答-------------------- 标记学习 --------------------编程问答-------------------- 若判断点是否在不规则的封闭曲线中呢? --------------------编程问答--------------------
引用 10 楼 yagebu1983 的回复:
用点,对角线分割多边形为三角形!!
求三角形面积,比较三角形面积!!

这个有点复杂~ --------------------编程问答--------------------
引用 16 楼 yatobiaf 的回复:
我知道在图形学中有三个方法:
1,面积法。就是看所有边和目标点组成的三角形面积和是否等于总的多边形面积,如果相等,则在内部。反之在外部。这种方法计算量较大,用到的主要计算是查乘。
2,夹角和法。参见三楼,判断所有边和目标点的夹角和是否为360度。计算量比上面这种方法稍微小点,用到主要是点乘和求模计算。
3,引射线法。就是从该点出发引一条射线,看这条射线和所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。这是所有方法中计算量最小的方法,在光线追踪算法中有大量的应用。

以当前点为起点O,连接3个相邻的点ABC,角度以顺时针方向的为准,如果角AOB为正但是角BOC为负,也就是说C点向内折返,那么算法1和2就会出错吧?只要线OB>线OC,这种折返的多边形就是成立的。
3.应该是正确的,但是应该这么表述:从当前点连接每个顶点,形成条线段,计算这些线段与所有边的交点数目,如果其中有一条线的交点数目为偶数,则当前点在外部。否则在内部。还有另外一个问题,如果当前点与某个顶点重合,或者如果当前点不与任何顶点重合,但是在某条边线上,则返回一个特殊的值 --------------------编程问答-------------------- 我刚才说的这种向内折返的多边形会导致算法1和2出错 --------------------编程问答--------------------
引用 25 楼 yuwenge 的回复:
用黑色Fill这个多边形的path在一个bitmap上,然后获取该点在bitmap上的颜色,黑色就在多边形内,无色就在多边形外。

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


正解!计算机图形就有数学图形不具备的优势! --------------------编程问答-------------------- 常见的比如黑色块遮罩,只要判断目标点是否是黑色,则表示该点是否在区域内!当然另一种方法是Contains,从速度上来说,这两种比上面的几种数学计算要快得多. --------------------编程问答-------------------- 用颜色遮罩的方法没有7楼的效率高。 --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,