如何根据X/Y坐标拆分Point3d列表?(C# Rhino Grasshopper场景)
C# Rhino Grasshopper点列表分组排序问题解答
问题描述
我刚接触C#,请多包涵。我正在Rhino Grasshopper中编写C#脚本,已提取出图像中同色像素对应的Point3d列表。想了解是否可按点的X或Y坐标对该列表进行排序并拆分为多个子列表,例如将同一X坐标的点归为一个列表,形成点的行列表。我对List的操作不熟悉,不确定是否应使用GroupBy方法。
附现有代码:
public List<Point3d> SitePt(string imgPath, Color myColor) { Bitmap siteImg = new Bitmap(imgPath); List<Point3d> sitePx = new List<Point3d>(); for (int i = 1; i < siteImg.Width - 1; i++) { for (int j = 1; j < siteImg.Height - 1; j++) { Color c = siteImg.GetPixel(i, j); if(myColor.Equals(c)) { Point3d p = new Point3d(i, j, 0); sitePx.Add(p); } } } return sitePx; }
解决方案
完全可以用GroupBy方法实现你的需求,这是处理这类分组场景最简洁高效的方式,以下是具体实现:
1. 按X坐标分组(列列表)
将同一X坐标的点归为子列表,同时可对子列表内的点按Y坐标排序:
// 获取目标点列表 List<Point3d> sitePx = SitePt("你的图片路径", targetColor); // 按X分组,每个分组内按Y升序排序 var groupedByX = sitePx .GroupBy(p => p.X) .Select(group => group.OrderBy(p => p.Y).ToList()) .ToList();
2. 按Y坐标分组(行列表)
将同一Y坐标的点归为子列表,同时可对子列表内的点按X坐标排序:
var groupedByY = sitePx .GroupBy(p => p.Y) .Select(group => group.OrderBy(p => p.X).ToList()) .ToList();
3. 额外优化
- 如果需要对分组后的整体按坐标排序(比如从左到右排列列),可在最后追加排序:
// 按X坐标从小到大排列所有列分组 var sortedColumns = groupedByX.OrderBy(col => col.First().X).ToList(); - 原方法中的
GetPixel性能较低,处理大图片时可改用LockBits提升效率,小图片则无需调整。
内容的提问来源于stack exchange,提问作者Olivia Jinkela
相关产品推荐
相关产品推荐

