打印 .obj 文件最高点的坐标?
Print the coordinates of the highest point of an .obj file?
我从来没有用 Python 处理过 3D 对象,所以我觉得有点迷茫。
我想知道是否可以创建一个程序来检测 3D 对象(.obj 格式)的最高点并给出它们的坐标。
我有一个关于比较 3D 对象的每个点并且只 return 最高点的坐标的想法。
我将不胜感激任何帮助,即使只是告诉我在哪里看。
编辑:我创建了一个 return 对象最大高度的程序。
它有效,但我如何才能使它 return 不仅是最高点的最大高度,而且是它沿另一轴的坐标?
例如,它会return:最高点在 5.04 米处。它的坐标是(xxx, xxx, 5.04)。有没有办法打印给定点的坐标?
编辑 2:这是我的实际代码。它 returns .obj 的最大高度。我想return最高点的3轴坐标
是否可以不将此代码应用于整个对象,而只应用于其中的一部分? (例如:在 x 轴和 y 轴上的精确间隔之间检测 z 上的最高点?)我不知道如何使用 python
处理坐标
import sys
filename = 'test2.obj' # sys.argv[1]
x, y, z = [], [], []
with open(filename) as f:
for line in f:
line = line[:-1].split(' ')
if line[0] == 'v':
y.append(float(line[2]))
print('height max = ' + str(max(y)) + ' m')
input()
EDIT 2: Here is my actual code. It returns the maximum height of a .obj. I would like it to return the 3-axis coordinates of the highest point.
在您的代码中,您仅附加到列表 y
。您还需要附加到相应的 x
和 y
列表。然后,您可以在 y
列表中找到最大值的索引,然后索引到具有相同索引的 x
和 z
列表。
将 x、y 和 z 值保存在单独的列表中有点麻烦。考虑将它们放在 namedtuple
中。然后你需要的只是这些命名元组的一个列表。
将此作为您的输入文件:
v 10.307 4.083 4.905
v 1.920 11.778 13.118
v 7.883 17.747 0.258
v 5.085 0.353 10.356
v 8.999 9.146 8.047
代码:
import sys
from collections import namedtuple
Point = namedtuple('Point', 'x y z')
points = []
filename = 'test2.obj' # sys.argv[1]
with open(filename) as f:
for line in f:
line = line[:-1].split(' ')
if line[0] == 'v':
x, y, z = map(float, line[1:])
points.append(Point(x, y, z))
highest_point = max(points, key=lambda point: point.z)
print('Highest point on the z-axis:', highest_point)
print(highest_point.x, highest_point.y, highest_point.z)
输出:
Highest point on the z-axis: Point(x=1.92, y=11.778, z=13.118)
1.92 11.778 13.118
max()
采用关键字参数 key,在这种情况下,它允许您对 z
属性进行比较,而不是 Point
namedtuple.
Could it be possible to apply this code not to the entire object, but only to a part of it? (example: detect the highest point on z between a precise interval on the x and y axis?)
当然可以。在找到最大点之前,过滤列表,使其只包含区间内的点。例如:
filtered_points = []
for point in points:
if 9 > point.x > 3 and 10 > point.y > 5:
filtered_points.append(point)
highest_point = max(filtered_points, key=lambda point: point.z)
print('Highest point on the z-axis between some interval on the x and y axis:', highest_point)
输出:
Highest point on the z-axis between some interval on the x and y axis: Point(x=8.999, y=9.146, z=8.04)
我从来没有用 Python 处理过 3D 对象,所以我觉得有点迷茫。
我想知道是否可以创建一个程序来检测 3D 对象(.obj 格式)的最高点并给出它们的坐标。
我有一个关于比较 3D 对象的每个点并且只 return 最高点的坐标的想法。
我将不胜感激任何帮助,即使只是告诉我在哪里看。
编辑:我创建了一个 return 对象最大高度的程序。
它有效,但我如何才能使它 return 不仅是最高点的最大高度,而且是它沿另一轴的坐标?
例如,它会return:最高点在 5.04 米处。它的坐标是(xxx, xxx, 5.04)。有没有办法打印给定点的坐标?
编辑 2:这是我的实际代码。它 returns .obj 的最大高度。我想return最高点的3轴坐标
是否可以不将此代码应用于整个对象,而只应用于其中的一部分? (例如:在 x 轴和 y 轴上的精确间隔之间检测 z 上的最高点?)我不知道如何使用 python
处理坐标import sys
filename = 'test2.obj' # sys.argv[1]
x, y, z = [], [], []
with open(filename) as f:
for line in f:
line = line[:-1].split(' ')
if line[0] == 'v':
y.append(float(line[2]))
print('height max = ' + str(max(y)) + ' m')
input()
EDIT 2: Here is my actual code. It returns the maximum height of a .obj. I would like it to return the 3-axis coordinates of the highest point.
在您的代码中,您仅附加到列表 y
。您还需要附加到相应的 x
和 y
列表。然后,您可以在 y
列表中找到最大值的索引,然后索引到具有相同索引的 x
和 z
列表。
将 x、y 和 z 值保存在单独的列表中有点麻烦。考虑将它们放在 namedtuple
中。然后你需要的只是这些命名元组的一个列表。
将此作为您的输入文件:
v 10.307 4.083 4.905
v 1.920 11.778 13.118
v 7.883 17.747 0.258
v 5.085 0.353 10.356
v 8.999 9.146 8.047
代码:
import sys
from collections import namedtuple
Point = namedtuple('Point', 'x y z')
points = []
filename = 'test2.obj' # sys.argv[1]
with open(filename) as f:
for line in f:
line = line[:-1].split(' ')
if line[0] == 'v':
x, y, z = map(float, line[1:])
points.append(Point(x, y, z))
highest_point = max(points, key=lambda point: point.z)
print('Highest point on the z-axis:', highest_point)
print(highest_point.x, highest_point.y, highest_point.z)
输出:
Highest point on the z-axis: Point(x=1.92, y=11.778, z=13.118)
1.92 11.778 13.118
max()
采用关键字参数 key,在这种情况下,它允许您对 z
属性进行比较,而不是 Point
namedtuple.
Could it be possible to apply this code not to the entire object, but only to a part of it? (example: detect the highest point on z between a precise interval on the x and y axis?)
当然可以。在找到最大点之前,过滤列表,使其只包含区间内的点。例如:
filtered_points = []
for point in points:
if 9 > point.x > 3 and 10 > point.y > 5:
filtered_points.append(point)
highest_point = max(filtered_points, key=lambda point: point.z)
print('Highest point on the z-axis between some interval on the x and y axis:', highest_point)
输出:
Highest point on the z-axis between some interval on the x and y axis: Point(x=8.999, y=9.146, z=8.04)