python - 如何从给定的顶点索引列表生成边列表?
解决方案
计算人脸的法线向量。如果 2 个相邻面的法向量指向不同的方向,则该面共享的两个顶点形成一条边。
可以使用叉积计算人脸的法线向量。对于具有顶点 A、B、C 的面,单位法向量为:
N = normalized(cross(B-A, C-A))
面的法线向量可以与点积进行比较。2 个法线向量 N1 和 N2 是等向的,如果:
equally_directed = abs(dot(N1, N2)) == 1
使用向量算术库。例如用于 Python或NumPy的 OpenGL 数学 (GLM) 库。
最小的例子:
import glm, math
vertices = [(-1,-1,-1), ( 1,-1,-1), ( 1, 1,-1), (-1, 1,-1), (-1,-1, 1), ( 1,-1, 1), ( 1, 1, 1), (-1, 1, 1)]
faces = [(0,1,2), (0,2,3), (5,4,7), (5,7,6), (4,0,3), (4,3,7), (1,5,6), (1,6,2), (4,5,1), (4,1,0), (3,2,6), (3,6,7)]
v = [glm.vec3(vertex) for vertex in vertices]
nv_list = [glm.normalize(glm.cross(v[i1]-v[i0], v[i2]-v[i0])) for i0,i1,i2 in faces]
edge_threshold = 0.99
edges = []
for i, f1 in enumerate(faces):
for j, f2 in enumerate(faces[i+1:]):
edge_candidates = [(f1[0], f1[1]), (f1[1], f1[2]), (f1[2], f1[0])]
for ei0, ei1 in edge_candidates:
if ei0 in f2 and ei1 in f2:
cos_nv = math.fabs(glm.dot(nv_list[i], nv_list[j+i+1]))
if abs(cos_nv) < edge_threshold:
edges.append((ei0, ei1))
print(len(edges))
print(edges)
输出:
12 [(1, 2), (0, 1), (3, 0), (2, 3), (4, 7), (5, 4), (6, 5), (7, 6), (4, 0), (3, 7), (1, 5), (6, 2)]
推荐阅读
- python - 在数据框上使用 groupby().sum(),然后绘制带有标签的饼图?
- html - Sass 风格不适用于内容
- npgsql - 有没有办法覆盖 Azure DB for PostgreSQL 上的服务器配置“statement_timeout”?
- excel - 如何从下拉列表中自动选择一个值?
- excel - VBA Excel - 使用 URL 插入图片 - 凭据窗口
- c# - 从 C# 查询照片 SQLite 数据库时找不到排序规则
- javascript - 如何使用 keycodes 和 clearRect() 在画布中修复这个圆圈的绘制
- java - 审计:对子修改的父实体修订(Javers/Envers/... + Hibernate)
- javascript - 如果输入类型文件不是图像,则使用 jquery 脚本显示警报
- c - C 套接字,代理 GET 请求返回 404