栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

多边形中的C#点

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多边形中的C#点

见这是在C
++中,可以在C#中的相同方式进行。

对于凸多边形来说太简单了:

如果多边形是凸的,则可以将多边形视为从第一个顶点开始的“路径”。如果一个点始终位于构成路径的所有线段的同一侧,则该点位于该多边形的内部。

给定P0(x0,y0)和P1(x1,y1)之间的线段,另一个点P(x,y)与该线段具有以下关系。计算(y-y0)(x1-x0)-(x-x0)(y1-y0)

如果小于0,则P位于线段的右侧;如果大于0,则P位于线段的左侧;如果等于0,则位于线段上。

这是它在C#中的代码,我没有检查边缘情况。

        public static bool IsInPolygon(Point[] poly, Point point)        {var coef = poly.Skip(1).Select((p, i) =>(point.Y - poly[i].Y)*(p.X - poly[i].X)         - (point.X - poly[i].X) * (p.Y - poly[i].Y))  .ToList(); if (coef.Any(p => p == 0))     return true; for (int i = 1; i < coef.Count(); i++) {     if (coef[i] * coef[i - 1] < 0)         return false; } return true;        }

我用简单的矩形测试它工作正常:

 Point[] pts = new Point[] { new Point { X = 1, Y = 1 },        new Point { X = 1, Y = 3 },        new Point { X = 3, Y = 3 },        new Point { X = 3, Y = 1 } }; IsInPolygon(pts, new Point { X = 2, Y = 2 }); ==> true IsInPolygon(pts, new Point { X = 1, Y = 2 }); ==> true IsInPolygon(pts, new Point { X = 0, Y = 2 }); ==> false

关于linq查询的说明:

poly.Skip(1)
==>创建一个新的列表,从位置开始
1
的的
poly
名单,然后由
(point.Y - poly[i].Y)*(p.X -poly[i].X) - (point.X - poly[i].X) * (p.Y -poly[i].Y)
我们要计算(这在引用的段落中提到的方向)。相似的例子(另一个操作):

lst = 2,4,8,12,7,19lst.Skip(1) ==> 4,8,12,7,19lst.Skip(1).Select((p,i)=>p-lst[i]) ==> 2,4,4,-5,12


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576198.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号