我绝对确定这个问题必须以前多次问过,但是对于我来说,我找不到一个线程来回答这个问题:
我要通过浏览顶点列表并将最低和最高x,y和z值选择到自己的最小且最小的最小且最小的最低限度来计算每个对象的最小值和最大界限,以便计算每个对象的最小值和最大界限,
我正在制作模型出口商在同一形式。我现在这样做的方式就是这样:
x = max(vertices,key=itemgetter(0))[0]
y = max(vertices,key=itemgetter(1))[1]
z = max(vertices,key=itemgetter(2))[2]
extents_max = (x, y, z)
x = min(vertices,key=itemgetter(0))[0]
y = min(vertices,key=itemgetter(1))[1]
z = min(vertices,key=itemgetter(2))[2]
extents_min = (x, y, z)
这有效,但是是否有一种更优雅的单线方式在Python中进行此操作?
只需删除重复的0、1、2,这是一个单线:
extents_max = [max(vertices,key=itemgetter(i))[i] for i in range(3)]
如果您需要如示例所示,请保持元组:
extents_max = tuple(max(vertices,key=itemgetter(i))[i] for i in range(3))
您可以用序列解开包装来计算这些:
mins, maxs = zip(*[(min(map(itemgetter(i), vertices)),
max(map(itemgetter(i), vertices)))
for i in range(3)])
例如:
>>> vertices = [(1,4,2), (1,3,0), (4,2,5)]
>>> mins, maxs = zip(*[(min(map(itemgetter(i), vertices)),
... max(map(itemgetter(i), vertices)))
... for i in range(3)])
>>> mins
(1, 2, 0)
>>> maxs
(4, 4, 5)
demodata:
verts = [(-94, -24, -87), (90, 27, -56), (-22, -59, -44), (50, -70, 52),
(-31, 37, -24), (-73, 53, 66), (-47, -28, 99), (-3, -42, -66),
(2, 85, 58), (79, -86, 39)]
查找最小/最大:
z = [(min(l),max(l)) for l in zip(*verts)] # [(min,max) for each
# (x0,..,xn),(y0,..,yn),(z0,..,zn) ]
extends_min, extends_max = zip(*z)
print(extends_min, extends_max)
输出:
(-94, -86, -87) (90, 85, 99)