这些类定义了多边形List<Polygon> Polygons
列表。
如何订购该列表,以便多边形首先按其点的 X 属性排序,然后按其点的 Y 属性排序顺序。
public class Polygon
{
public List<Point2D> Points;
}
public class Point2D
{
public double X;
public double Y;
}
更新:例如,请考虑以下多边形:
(A) (0, 0) -> (5, 1) -> (5, -3) -> (0, -3) -> (0, 0)
(B) (0, -10) -> (5, -9) -> (5, -13) -> (0, -13) -> (0, -10)
(C) (10, 0) -> (15, 1) -> (15, -3) -> (10, -3) -> (10, 0)
排序后的输出:
(A) (0, -10) -> (5, -9) -> (5, -13) -> (0, -13) -> (0, -10)
(B) (0, 0) -> (5, 1) -> (5, -3) -> (0, -3) -> (0, 0)
(C) (10, 0) -> (15, 1) -> (15, -3) -> (10, -3) -> (10, 0)
答案 0 :(得分:2)
您需要将其他属性添加到多边形类
public class Polygon
{
public List<Point2D> Points;
public Point2D MinPoint;
}
这部分将取决于你的分数,并擅长适合你的算法。 那么你需要找到多边形的最小点一个多边形的代表。可能是凸壳的中心,左下点或中心。一位代表。 (这可能有点不对,但你需要稍微玩一下)。这取决于各种情况
foreach(var poly in Polygons)
{
int minx = poly.Points.Min(p=>p.X);
int minY = poly.Points.Where(p=>p.X==minX).Min(p=>p.Y);
poly.MinPoint = poly.Points.FirstOrDefault(p=>p.X==minX && p.Y==minY)
}
然后你可以对它进行排序。
var sortedPolygons = polygons.OrderBy(p=>p.MinPoint.X).ThenBy(p=>p.MinPoint.Y);
答案 1 :(得分:1)
您似乎想要根据点的最小X值对多边形进行排序,如果它们相等,则基于其点的最小Y值。
以下是使用LINQ的方法:
var result =
Polygons
//Order by smallest X
.OrderBy(pl => pl.Points.Min(pn => pn.X))
//Then by smallest Y
.ThenBy(pl => pl.Points.Min(pn => pn.Y))
.ToList();
答案 2 :(得分:0)
您可以编写一个Comparer类来比较多边形内的点,并使用它来对多边形进行排序。
class PointsComparer : IComparer<List<Point2D>>
{
public int Compare(List<Point2D> left, List<Point2D> right)
{
for (int i = 0; i < left.Count && i < right.Count; i++) {
int c = left[i].X.CompareTo(right[i].X);
if (c != 0) return c;
c = left[i].Y.CompareTo(right[i].Y);
if (c != 0) return c;
}
return left.Count.CompareTo(right.Count);
}
}
polygons.OrderBy(poly => poly.Points, new PointsComparer());
附注:您可能希望将这些字段转换为属性。