欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > 【Grasshopper】【Python】点集排序:带索引的Z字形排序算法

【Grasshopper】【Python】点集排序:带索引的Z字形排序算法

2025/1/21 13:41:01 来源:https://blog.csdn.net/hmywillstronger/article/details/145212756  浏览:    关键词:【Grasshopper】【Python】点集排序:带索引的Z字形排序算法

Grasshopper Python点集排序:带索引的Z字形排序算法

在这里插入图片描述

1. 功能介绍

这段代码实现了一个在Grasshopper中的点集排序功能,不仅可以将空间中的点按照Y坐标分组并在每组内按X坐标排序,还能追踪每个点的原始索引位置。

2. 输入输出参数

  • 输入参数:
    • x: 待排序的点集(Point List)
    • t: 容差值(Number),默认2000
  • 输出参数:
    • a: 排序后的点集(Point List)
    • i: 排序后点的原始索引(Number List)

3. 核心算法流程

输入点集
点集是否为空?
创建点索引对
返回None
按Y坐标分组
组内按X排序
提取排序后的点
提取对应的索引
输出排序点集
输出索引列表

4. 代码解析

4.1 点索引对的创建和处理

points_with_index = list(enumerate(x))
  • 使用enumerate()创建(索引, 点)对
  • 将每个点与其原始位置绑定

4.2 分组函数

def groupPointsByY(points_with_index, tolerance):points_with_index = sorted(points_with_index, key=lambda pair: pair[1].Y)groups = []current_group = [points_with_index[0]]current_y = points_with_index[0][1].Y
  • 函数接收点索引对和容差值
  • 使用lambda函数访问点的Y坐标进行排序
  • pair[1]访问点对象,pair[0]访问索引

4.3 分组逻辑

for p in points_with_index[1:]:if abs(p[1].Y - current_y) <= tolerance:current_group.append(p)else:groups.append(current_group)current_group = [p]current_y = p[1].Y
  • 遍历点索引对
  • 基于Y坐标差值分组
  • 保持索引与点的关联

4.4 排序和结果提取

for group in grouped_points:group_sorted = sorted(group, key=lambda pair: pair[1].X)for index, point in group_sorted:sorted_points.append(point)sorted_indices.append(index)
  • 组内按X坐标排序
  • 分别提取点和索引
  • 维护排序后的两个列表

5. Python语法要点

5.1 元组拆包

for index, point in group_sorted:
  • 直接将元组拆分为两个变量
  • 简化数据访问

5.2 Lambda表达式

key=lambda pair: pair[1].X
  • 用于定义排序键函数
  • 访问元组中点对象的坐标

5.3 列表操作

sorted_points.append(point)
sorted_indices.append(index)
  • 使用append()逐个添加元素
  • 维护两个平行列表

6. 数据结构

6.1 点索引对

(index, point) 结构:
- index: 原始位置
- point: 点对象- X: X坐标- Y: Y坐标- Z: Z坐标

6.2 分组结构

groups = [[(index1, point1), (index2, point2), ...],  # 第一组[(index3, point3), (index4, point4), ...],  # 第二组...
]

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com