REWRITE:我对这个问题没有得到太多反馈,我认为我没有正确地写出来并试图澄清。
我正在制作一个让人们创建国家的计划。下图中的粗红线是所述国家的边界。我试图弄清楚如何生成一个多边形,填充“边框”线内的整个区域。我有接受多边形工作的三角测量代码 - 我用手动输入的多边形测试了 - 现在我试图弄清楚如何从线/链接点生成多边形。
有关详细信息 - 所有红线都是黄点连接在一起的方式。用户将黄点拖动到一起以链接线条。多边形可能在内部有一个洞并且是开放的 - 我要做的是制作处理开放多边形的代码和在其中有孔的多边形,并生成所有黄点位置的输出(带有x和z的vector3)对于我的三角测量代码,它位于y平面上的0处。
我仍然想方设法解决这个问题,但我还没有想出去哪里开始寻找解决方案。感谢您的帮助。
以下老问题
我正在尝试找到一种将点连接在一起形成内部多边形的方法。基本上,我正在创建一个程序,让人们将线路连接在一起。在形成闭合多边形之后,应该在线内生成一个新的多边形对象。
我不太清楚如何做到这一点 - 我已经做到了这样他们可以生成线条并将它们链接在一起,但如何做一个封闭的多边形让我感到惊讶。我看着凸壳,但这是不一样的,并试图寻找或思考一些似乎不起作用的不同的东西。我很好奇是否有人能指出我的写作方向/关于如何继续创作的教程或想法。
我上传了两张图片以帮助说明我的观点。
上面是我想要做的但不太确定如何 - 基本上,当用户完成一个闭合的多边形(所有的黄点都是多边形的外部点)时,我希望它生成一个内部多边形(由黑色1,2和3)。
答案 0 :(得分:1)
您可能会被Polylines强调。这可以帮助您防止大量关于图论的研究。与Polygon类一样,您可以填充Polyline对象。 The documentation说:
此对象类似于Polyline对象,但此对象必须是封闭的形状。
由于您希望自己的形状“开放”,这可以帮助您。
链接的手册页甚至包含了如何以编程方式创建Polyline的示例:
// Add the Polyline Element
myPolyline = new Polyline();
myPolyline.Stroke = System.Windows.Media.Brushes.SlateGray;
myPolyline.StrokeThickness = 2;
myPolyline.FillRule = FillRule.EvenOdd;
System.Windows.Point Point4 = new System.Windows.Point(1, 50);
System.Windows.Point Point5 = new System.Windows.Point(10, 80);
System.Windows.Point Point6 = new System.Windows.Point(20, 40);
PointCollection myPointCollection2 = new PointCollection();
myPointCollection2.Add(Point4);
myPointCollection2.Add(Point5);
myPointCollection2.Add(Point6);
myPolyline.Points = myPointCollection2;
myGrid.Children.Add(myPolyline);
你的第二个要求是,你的形状可以有“洞”。
请注意,您无需负责填充Polyline。通过设置 myPolyline.FillRule ,您可以在形状内部设置“洞”。请参阅MSDN上的Polyline.FillRule页面,其中显示:
如果您对如何制作“漏洞”有进一步的意愿,请查看Geometry.Combine方法,尤其是GeometryCombineMode。
演示GeometryCombineModes ...
的示例
玩得开心:)
图片和代码是Microsoft提供的示例内容,是从MSDN中提取的。重新使用时,请注意通过给定链接提供的版权。要在这里使用这些内容,我想参考Microsoft Limited Public License。
答案 1 :(得分:0)
Marching Quads的衍生物怎么样?你可以这样:
对于每三个点(按网格内部的创建顺序分组)找到多边形的中心并让用户为其指定一个bool值,该值将定义此多边形是在网格内部还是外部,然后绘制它或不
答案 2 :(得分:0)
您无法创建开放多边形。它只是在关闭时变成多边形。但是,这是一种可能满足您需求的方法。
通过连接所有可用线来创建闭合多边形,然后计算在起始点处于中间状态时将起点与终点链接起来的最终线。
然后,
这种方法或修改后的版本会产生开放多边形的错觉。
答案 3 :(得分:0)
Commenter @ SamyS.Rathore是对的。如果您的问题是“如何在平面图中找到其顶点和边缘的闭合区域(多边形)?”那么你想要研究像<{3}}这样的简单圆算法。
然而,在找到这些圈之后,需要额外的工作来支持洞。基本上你要做的是检测多边形是否在另一个多边形内,然后在几何上减去它。
Simple Circles不处理部分打开的区域。但在你的情况下这应该不是问题,因为这些区域只能存在于比赛场地的外边界,用户可以随意轻松关闭它们。
答案 4 :(得分:0)
我通过获取每个点并将其链接到具有基本向量3(该点的位置)以及从其出去的每个链接线的类来完成此操作。基本上
类DoubleV3 Vector3 MiddleVector 列出LinkedVectors
我还会通过删除所有冗余行来照顾那些偶然或故意多次输入相同条目的人。
之后我经历了整个事情并检查每个doubleV3的链接向量,我从每个链接向量到最左边的向量(基本上,我检查每个链接向量列表的最后一个向量和下一个向量到北向量1从中间向上并采取最小的角度)。这给了我一堆封闭的多边形(是的,我现在知道正确的术语是循环,我现在使用它)。这涉及开放周期(我不想要)。它不会处理来自重叠线的复杂循环,但我在另一种方法中处理它。
之后我只删除所有重复的多边形并检查以确保其中没有多边形(我也抛弃了不属于外壳的所有内部循环)。
感谢大家帮助我^。^这就是我最终做到这一点以防万一其他人都在我的情况。