如何为3D顶点集合创建索引列表及进行相关数据处理
如何为3D顶点集合创建索引列表及进行相关数据处理
嘿,我来帮你一步步搞定这个3D顶点的处理需求,用Python来实现的话非常直观,咱们一步步拆解你的需求:
第一步:解析原始数据,生成顶点列表A
首先,咱们需要把每一行的6个坐标值拆成两个独立的3D顶点三元组,然后把所有这些三元组收集到列表A里。比如你给的每一行是x1,y1,z1,x2,y2,z2,咱们要把它拆成(x1,y1,z1)和(x2,y2,z2)两个顶点。
举个代码实现的例子:
# 原始顶点数据(你提供的内容) raw_data = """0.142000E+03 -.600000E+03 0.262790E+04 -.142000E+03 -.600000E+03 0.262790E+04 -.984000E+02 -.599999E+03 0.258430E+04 0.984000E+02 -.599999E+03 0.258430E+04 0.984000E+02 -.599999E+03 0.258430E+04 0.984000E+02 -.599999E+03 0.238750E+04 0.984000E+02 -.599999E+03 0.258430E+04 -.984000E+02 -.599999E+03 0.258430E+04 -.984000E+02 -.599999E+03 0.238750E+04 0.984000E+02 -.599999E+03 0.238750E+04 -.142000E+03 0.600000E+03 0.262800E+04 0.142000E+03 0.600000E+03 0.262800E+04 0.984000E+02 0.599999E+03 0.258430E+04 -.984000E+02 0.599999E+03 0.258430E+04 0.142000E+03 0.600000E+03 0.262800E+04 0.142000E+03 0.600000E+03 0.234400E+04""" # 初始化列表A list_a = [] # 遍历每一行数据 for line in raw_data.splitlines(): # 把每行的字符串转换成浮点数列表 coords = list(map(float, line.split())) # 拆分成两个3D顶点 vertex1 = (coords[0], coords[1], coords[2]) vertex2 = (coords[3], coords[4], coords[5]) # 添加到列表A list_a.append(vertex1) list_a.append(vertex2) print("列表A的部分内容:", list_a[:5])
第二步:创建唯一顶点列表B及索引映射
接下来,咱们需要从列表A里提取所有唯一的顶点,给每个顶点分配一个唯一索引。这里我会用两个结构:
- 一个列表
list_b:存储所有唯一的顶点,索引就是它们的位置 - 一个字典
vertex_to_index:用来快速查找某个顶点对应的索引,方便后续转换
代码示例:
# 初始化唯一顶点列表和索引字典 list_b = [] vertex_to_index = {} for vertex in list_a: # 如果顶点还没被记录过,就添加到列表B并记录索引 if vertex not in vertex_to_index: vertex_to_index[vertex] = len(list_b) list_b.append(vertex) # 打印结果看看 print("唯一顶点列表B:", list_b) print("顶点到索引的映射:", vertex_to_index)
注意哦:这里用tuple作为字典的键是因为列表是不可哈希的,而元组可以直接用来做键。如果你的顶点坐标是浮点数,要注意精度问题——如果有两个顶点因为浮点精度差异看起来一样但实际数值有微小差别,可能会被当成不同的顶点,这时候可以考虑对浮点数做四舍五入处理(比如保留3位小数)再存入字典。
第三步:生成列表C(顶点索引对)
我猜你说的列表C应该是把原始的每条边(也就是每一行的两个顶点)转换成对应的索引对,这样后续处理可以用更紧凑的索引来代替冗长的坐标值。实现起来很简单:
list_c = [] # 重新遍历原始数据的每一行,生成索引对 for line in raw_data.splitlines(): coords = list(map(float, line.split())) vertex1 = (coords[0], coords[1], coords[2]) vertex2 = (coords[3], coords[4], coords[5]) # 查找对应的索引 idx1 = vertex_to_index[vertex1] idx2 = vertex_to_index[vertex2] # 添加到列表C list_c.append((idx1, idx2)) print("列表C(索引对):", list_c)
这样一套流程下来,你就完成了从原始顶点数据到索引化列表的全部处理啦!如果还有其他需求,比如导出成特定格式,或者处理更大规模的数据,都可以基于这个基础逻辑调整。
备注:内容来源于stack exchange,提问作者ubecop
相关产品推荐
相关产品推荐

