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

embedded/2025/1/19 5:01:24/

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), ...],  # 第二组...
]

http://www.ppmy.cn/embedded/155144.html

相关文章

Unreal Engine 5 C++ Advanced Action RPG 八章笔记

第八章 Boss Enemy 2-Set Up Boss Character 创建Boss敌人流程 起始的数据UI战斗能力行为树 这集新建Boss敌人的蓝图与动画蓝图和混合空间,看看就行巨人在关卡中,它的影子被打破,更改当前项目中的使用的阴影贴图就可以解决 从虚拟阴影贴图更改为阴影贴图即可 3-Giant Start…

vscode——如何让标点总是成对出现

vscode——如何让标点总是成对出现&#xff1a; 打开vscode&#xff0c;在设置中输入editor.autoClosing 将设置参数全部改成always

《Keras 3 在 TPU 上的肺炎分类》

Keras 3 在 TPU 上的肺炎分类 作者&#xff1a;Amy MiHyun Jang创建日期&#xff1a;2020/07/28最后修改时间&#xff1a;2024/02/12描述&#xff1a;TPU 上的医学图像分类。 &#xff08;i&#xff09; 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 简介 设置 本教程将介…

MyBatis执行一条sql语句的流程(源码解析)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程&#xff08;源码解析&#xff09; MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…

一、1-2 5G-A通感融合基站产品及开通

1、通感融合定义和场景&#xff08;阅读&#xff09; 1.1通感融合定义 1.2通感融合应用场景 2、通感融合架构和原理&#xff08;较难&#xff0c;理解即可&#xff09; 2.1 感知方式 2.2 通感融合架构 SF&#xff08;Sensing Function&#xff09;&#xff1a;核心网感知控制…

Spring Bean的提前加载和懒加载

一、将特定的bean 提前加载来满足其他bean对该bean 的依赖 通过实现 BeanFactoryPostProcessor 该接口重写postProcessBeanFactory&#xff08;&#xff09; 方法来进行bean的提前加载 在Bean1中加载Bean2 让Bean提前加载。 再写一个Bean3让系统加载&#xff08;无调用&#x…

Vue.js组件开发-如何实现表头搜索

在Vue.js组件开发中&#xff0c;实现表头搜索通常涉及在表格组件的表头添加输入框&#xff0c;并让用户能够输入搜索关键字来过滤表格数据。 以下是一个使用Element UI的el-table组件实现表头搜索的示例&#xff1a; 一、准备阶段 ‌确保Element UI已安装‌&#xff1a; 确保…

Spring Boot与MyBatis

Spring Boot与MyBatis的配置 一、简介 Spring Boot是一个用于创建独立的、基于Spring的生产级应用程序的框架&#xff0c;它简化了Spring应用的初始搭建以及开发过程。MyBatis是一款优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。将Spring Boot和MyBa…