You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:30:44