判断线段与多边形、多边形与多边形是否相交的算法(C#)

问题描述

判断线段与多边形、多边形与多边形是否相交(C#),包括线段、多边形包含在多边形内,线段与多边形某一条边重合的情况判断。求教各位大神!我有写一个判断线段与多边形的边时候相交的算法,但是貌似没有判断成功,请各位大神指导!谢谢!publicboolGetLineIntersection(GraphicGraphic,GraphicDrawPolygonGraphic){doubledistAB,theCos,theSin,newX,ABpos;doubleX=0;doubleY=0;DrawPolygon=DrawPolygonGraphic.GeometryasPolygon;if(Graphic.Geometry.GetType().ToString()=="ESRI.ArcGIS.Client.Geometry.Polyline"){polyline=Graphic.GeometryasPolyline;foreach(varpointCollectioninDrawPolygon.Rings){PointCollectiondrawlist=pointCollection;foreach(varpcinpolyline.Paths){PointCollectionlinelist=pc;for(inti=0;i<drawlist.Count-1;i++){for(intj=0;j<linelist.Count-1;j++){if((drawlist[i+1].Y-drawlist[i].Y)*(linelist[j].X-linelist[j+1].X)-(drawlist[i+1].X-drawlist[i].X)*(linelist[j].Y-linelist[j+1].Y)==0){returnfalse;}X=((drawlist[i+1].X-drawlist[i].X)*(linelist[i].X-linelist[i+1].X)*(linelist[i].Y-drawlist[i].Y)-linelist[i].X*(drawlist[i+1].X-drawlist[i].X)*(linelist[i].Y-linelist[i+1].Y)+drawlist[i].X*(drawlist[i+1].Y-drawlist[i].Y)*(linelist[i].X-linelist[i+1].X))/((drawlist[i+1].Y-drawlist[i].Y)*(linelist[i].X-linelist[i+1].X)-(drawlist[i+1].X-drawlist[i].X)*(linelist[i].Y-linelist[i+1].Y));Y=((drawlist[i+1].Y-drawlist[i].Y)*(linelist[i].Y-linelist[i+1].Y)*(linelist[i].X-drawlist[i].X)-linelist[i].Y*(drawlist[i+1].Y-drawlist[i].Y)*(linelist[i].X-linelist[i+1].X)+drawlist[i].Y*(drawlist[i+1].X-drawlist[i].X)*(linelist[i].Y-linelist[i+1].Y))/((drawlist[i+1].X-drawlist[i].X)*(linelist[i].Y-linelist[i+1].Y)-(drawlist[i+1].Y-drawlist[i].Y)*(linelist[i].X-linelist[i+1].X));if((X-drawlist[i].X)*(X-drawlist[i+1].X)<=0&&(X-linelist[i].X)*(X-linelist[i+1].X)<=0&&(Y-drawlist[i].Y)*(Y-drawlist[i+1].Y)<=0&&(Y-linelist[i].Y)*(Y-linelist[i+1].Y)<=0){returntrue;}}}}}}returnfalse;}

解决方案

解决方案二:
点是否在多边形内(含边界上)privateboolpointInPolygon(floatx,floaty,PointF[]polygon){inti;intj=polygon.Length-1;booloddNodes=false;for(i=0;i<polygon.Length;i++){if((polygon[i].Y<y&&polygon[j].Y>=y||polygon[j].Y<y&&polygon[i].Y>=y)&&(polygon[i].X<=x||polygon[j].X<=x)){if(polygon[i].X+(y-polygon[i].Y)/(polygon[j].Y-polygon[i].Y)*(polygon[j].X-polygon[i].X)<x){oddNodes=!oddNodes;}}j=i;}returnoddNodes;}

判断多边形、线段是否和另一多边形相交,可先判断他们的控制矩形是否相交RectangleF.IntersectsWith方法更可以用RectangleF.IntersectsWith取回控制举行的交集然后再做点是否在多边形中的判断用GraphicsPath.IsVisible可能更快
解决方案三:
你好!请问RectangleF.IntersectsWith方法怎么写?
解决方案四:
给你一个演示usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespace多边形相交{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);varg=e.Graphics;g.SmoothingMode=SmoothingMode.AntiAlias;g.InterpolationMode=InterpolationMode.HighQualityBicubic;g.CompositingQuality=CompositingQuality.HighQuality;using(varp1=newGraphicsPath()){p1.AddPolygon(newPointF[]{newPointF(10,20),newPointF(80,160),newPointF(200,25)});g.DrawPath(Pens.Green,p1);varp2=newGraphicsPath();p2.AddPolygon(newPointF[]{newPointF(210,200),newPointF(100,100),newPointF(220,30)});g.DrawPath(Pens.Red,p2);varbox1=p1.GetBounds();varbox2=p2.GetBounds();if(box1.IntersectsWith(box2)){varpen1=newPen(Color.Green,1);pen1.DashStyle=System.Drawing.Drawing2D.DashStyle.Custom;pen1.DashPattern=newfloat[]{5,5};g.DrawRectangle(pen1,box1.X,box1.Y,box1.Width,box1.Height);varpen2=newPen(Color.Red,1);pen2.DashStyle=System.Drawing.Drawing2D.DashStyle.Custom;pen2.DashPattern=newfloat[]{5,5};g.DrawRectangle(pen2,box2.X,box2.Y,box2.Width,box2.Height);varbox3=RectangleF.Intersect(box1,box2);varpen3=newPen(Color.Black,3);pen3.DashStyle=System.Drawing.Drawing2D.DashStyle.Custom;pen3.DashPattern=newfloat[]{1,1};g.DrawRectangle(pen3,box3.X,box3.Y,box3.Width,box3.Height);}}}}}

红、绿实线为多边形,红、绿虚线框分别是他们的控制矩形黑虚线框是两个控制矩形的相交矩形你可据此写出分析算法,而不是一味的循环

时间: 2024-11-03 04:10:49

判断线段与多边形、多边形与多边形是否相交的算法(C#)的相关文章

POJ 1410 判断线段相交点在多边形内外

题意:判断一线段与矩形是否相交.需要注意的是输入可能不是按照左上右下的顺序,如果线段两个端点都在举行内的话也算相交. 这题分为判断线段与4边是否有交点,如果没有判断两点是否在矩形内就可以了.我用的方法是射线法. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef double PointType; str

POJ 1066 判断线段相交

题意:有个考古队进金字塔里盗墓,大小100*100,样图是一个俯视图,给了财宝坐标,又给了各个墙.题目规定考古队在每面墙的中点处开一个洞,这样就避免了两墙交点的情况,求最小的凿墙数目. 很明显,枚举连接四面两个墙之间中点与宝藏的线段,求出这种线段与墓里墙相交的最小值.其实可以不用枚举中点,直接用墙的端点与宝藏相连的线段就行,细想一想可以想明白. #include <iostream> #include<cstdio> #include<cstring> #include

POJ 2653 暴力判断线段相交

题意是按照输入的先后顺序放木棍,然后输出最上层的木棍,何为最上层,就是木棍上方没有木棍和它相交就行. 这题坑爹啊,一直TLE后来才发现最上层木棍不是底下的木棍数最多而是只要上方没有木棍就行.所以只需要开一个标记数组从前往后如果后面有与它相交的那么这个木棍肯定不是最上层的,知道这些再知道线段相交的模板就可以A了. #include <iostream> #include<cstdio> #include<cstring> #include<algorithm>

算法系列(十二)多边形区域填充算法:扫描线填充算法(有序边表法)

二.扫描线算法(Scan-Line Filling) 扫描线算法适合对矢量图形进行区域填充,只需要 直到多边形区域的几何位置,不需要指定种子点,适合计算机自动进行图形处理的场合使用,比如电 脑游戏和三维CAD软件的渲染等等. 对矢量多边形区域填充,算法核心还是求交.<计算几何 与图形学有关的几种常用算法>一文给出了判断点与多边形关系的算法――扫描交点的奇偶数判断算 法,利用此算法可以判断一个点是否在多边形内,也就是是否需要填充,但是实际工程中使用的填充 算法都是只使用求交的思想,并不直接使用这

图像处理-请教:请问如何把一个多边形区域像素化?

问题描述 请教:请问如何把一个多边形区域像素化? 把这些像素的值存到数组里,多边形内部元素值为1,外部为0.谢谢了! 解决方案 如何判断点是否在一个不规则的多边形区域内? 解决方案二: 这还不简单么,循环遍历这个数组,根据下标等比例算出坐标,根据坐标计算它在多边形内还是外,然后设置0和1. 判断是否在多边形内,可以取多边形内一点和这一点得到直线方程,如果有奇数个解,就在内部,否则在外部. 解决方案三: 调用API函数,获取像素值.存于数组, 循环读取就行呀 解决方案四: long CVector

用AS画图,自定义多边形及圆形

这两天在研究关于as画图的问题,经过一番折腾后终于是出来了,(部分代码来源于 programming macromedia flash mx) AS: MovieClip.prototype.drawRegAng = function(x, y, r, num, rotation) {/*参数说明:x,y:多边形的中心坐标;r:多边形半径;num:多边形边数;最后一个是旋转角度*/ var tAngle = (rotation-90)*Math.PI/180; var angle = 2*Mat

几何画板多边形工具使用方法

  现在,不少人都在使用几何画板.大家都知道,几何画板是优秀的几何绘图软件,我们可以用几何画板绘制各种各样的几何图形.其工具箱包含了基本的绘图工具,以下教程将详细介绍几何画板多边形工具使用方法. 多边形工具的默认状态是画多边形内部工具,若用鼠标左键该工具不放,弹出多边形工具选择板,依次是"画多边形内部"."画多边形内部及边"."画多边形的边". 几何画板多边形工具 1.绘制无边且不含内部的多边形 在绘图板上单击鼠标开始画多边形顶点,再在另一个位置

c语言-多边形外二维坐标点排序问题

问题描述 多边形外二维坐标点排序问题 新手求指教,刚开通的csdn没c币,望各位大牛不吝指教: 问题是:二维坐标系内,多边形外部存在一些已知坐标的顶点,这些坐标点包围多边形,有什么方法把这些顶点按顺序排列,形成包围多边形的外围多边形: 解决方案 坐标点排序问题坐标点排序 解决方案二: http://bbs.csdn.net/topics/390010223

PostgreSQL 单列多条件查询优化 - 多个多边形查询4倍提升的技巧

标签 PostgreSQL , PostGIS , 多边形合并 , 条件合并 , 菜鸟 背景 在某些空间数据查询需求中,有一些这样的请求,例如查找与某些多边形中的任意一个相交的空间对象. 比如在菜鸟.新零售的业务中,查询某几个商场多边形,或者某几个小区多边形内覆盖的点. SQL写法可能是这样的 select geo_point,* from table where ST_Within(geo_point, polygon_1) or ST_Within(geo_point, polygon_2)