【问题标题】:How to separate inner polygon and outer polygon from a list of points in C#如何从C#中的点列表中分离内多边形和外多边形
【发布时间】:2020-11-24 22:07:57
【问题描述】:

假设一个像下面这样的多边形

我有上面的形状和任意顺序的点列表

Point[] polygon = { A(x,y), B (x,y) ..... L(x,y) }

我需要分离外多边形和内多边形点。

Point[] outerpoly = { A(x,y), B(x,y), C(x,y)... H(x,y) }

Point[] innerpoly = { I(x,y), J(x,y), K(x,y), L(x,y) }

出于算法的目的,我们可以假设Point 可以在System.Windows.PointSystem.Drawing.Point 中。

请帮我找到一个算法来获取内外多边形的点列表。

【问题讨论】:

  • 如果你只有一个任意顺序的点列表,有多种方法可以将它们分成两个环。就像你的例子一样,有很多组合。
  • @TimTim Wong,真的。那就是问题所在。我希望我可以将它们分离为闭合多边形,在本例中为 2 个闭合多边形。
  • 多边形当然是封闭的。我的意思是它可能是 ABCFGHLI 和 DEKJ,或其他组合。
  • 那么不可能??
  • 是的,没有确定性的解决方案。

标签: c# polygon shapes system.drawing


【解决方案1】:

使用递增值向下和向右的坐标系,您可以对每个多边形的点进行排序和选择。

创建List<Point>s 来存储结果:

var outerpoly = new List<Point>();
var innerpoly = new List<Point>();

现在对初始选择的点进行垂直排序:

var vertical = polygon.OrderByDescending(p => p.Y).ToList();

然后对于每个部分,将它们水平排序并提取您需要的内容。

一、外多边形:

var outerBottom = vertical.Take(2).OrderBy(p => p.X);    
outerpoly.AddRange(outerBottom);

var outerRightBottomIn = vertical.Skip(2).Take(4).OrderByDescending(p => p.X).Take(2);
outerpoly.AddRange(outerRightBottomIn);

var outerRightTopOut = vertical.Skip(8).Take(2).OrderBy(p => p.X);
outerpoly.AddRange(outerRightTopOut);

var outerTop = vertical.Skip(10).OrderByDescending(p => p.X);
outerpoly.AddRange(outerTop);

然后是内部多边形:

var innerBottom = vertical.Skip(2).Take(4).OrderBy(p => p.X).Take(2);
innerpoly.AddRange(innerBottom);

var innerTop = vertical.Skip(6).Take(2).OrderByDescending(p => p.X);
innerpoly.AddRange(innerTop);

【讨论】:

  • 让我确认@NetMage
  • 我进行了测试,但结果不如预期。如果您需要更多信息,请告诉我。
猜你喜欢
  • 2010-10-28
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2013-02-04
  • 2017-05-12
相关资源
最近更新 更多