【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 点索引对的创建和处理

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

4.2 分组函数

python 复制代码
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 分组逻辑

python 复制代码
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 排序和结果提取

python 复制代码
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 元组拆包

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

5.2 Lambda表达式

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

5.3 列表操作

python 复制代码
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), ...],  # 第二组
    ...
]
相关推荐
Salt_072819 小时前
DAY 19 数组的常见操作和形状
人工智能·python·机器学习
无心水19 小时前
【Python实战进阶】2、Jupyter Notebook终极指南:为什么说不会Jupyter就等于不会Python?
python·jupyter·信息可视化·binder·google colab·python实战进阶·python工程化实战进阶
q***829119 小时前
windows同时安装两个不同版本的Mysql
windows·mysql·adb
稚辉君.MCA_P8_Java19 小时前
Gemini永久会员 Java动态规划
java·数据结构·leetcode·排序算法·动态规划
dntktop19 小时前
搜索+计算+插件…这个“全能管家”让你告别80%的桌面图标
运维·windows·自动化·编辑器
上班日常摸鱼20 小时前
Shell脚本基础教程:变量、条件判断、循环、函数实战(附案例)
python
h***346320 小时前
Redis安装教程(Windows版本)
数据库·windows·redis
无心水20 小时前
【Python实战进阶】5、Python字符串终极指南:从基础到高性能处理的完整秘籍
开发语言·网络·python·字符串·unicode·python实战进阶·python工业化实战进阶
2301_8075832320 小时前
了解python,并编写第一个程序,常见的bug
linux·python
小白学大数据20 小时前
构建混合爬虫:何时使用Requests,何时切换至Selenium处理请求头?
爬虫·python·selenium·测试工具