gpt4 book ai didi

python - 寻找 3D 曲面的开口

转载 作者:行者123 更新时间:2023-11-28 21:13:40 25 4
gpt4 key购买 nike

我有一个包含笛卡尔坐标 XYZ 的数组 sphere。每行是物体表面的一个点。我想找到该表面的开口并旋转对象,使 x 轴指向开口外。

我正在使用 python 和 numpy,但通用方法与特定实现一样好。

这是我目前拥有的。 x 轴为红色,原点为绿色:

enter image description here

这是我想要得到的:

enter image description here

最佳答案

通常,您希望对数据应用旋转矩阵。但是,您还需要找到旋转矩阵。

在这种情况下,更容易直接跳到处理协方差矩阵的特征向量。这基本上是一种主成分方法。如果我们确定您数据的主要组成部分并将其旋转到该坐标系中,我们将有效地完成您想要的操作。

首先,让我们生成一个类似于您的示例:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def main():
x, y, z = generate_data()
plot(x, y, z)
plt.show()

def generate_data():
lat, lon = np.radians(np.mgrid[-90:90:20j, 0:180:20j])
lon -= np.radians(40)
z = np.cos(lat) * np.cos(lon)
x = np.cos(lat) * np.sin(lon)
y = np.sin(lat)
return x, y, z

def plot(x, y, z):
fig, ax = plt.subplots(subplot_kw=dict(projection='3d'), facecolor='w')
artist = ax.scatter(x, y, z, marker='o', color='y')
ax.set(xlim=[-1.1, 1.1], ylim=[-1.1, 1.1], zlim=[-1.1, 1.1], aspect=1)
ax.set(xlabel='X', ylabel='Y', zlabel='Z')
return artist

main()

enter image description here

现在我们可以根据主坐标旋转物体了:

def reorient(x, y, z):
xyz = np.vstack([x.ravel(), y.ravel(), z.ravel()])
cov = np.cov(xyz)

# Find the eigenvectors of the covariance matrix
vals, vecs = np.linalg.eigh(cov)
idx = np.argsort(vals)
# The eigenvalues vals are not needed below, but this puts them in
# the same order as the eigenvectors, should they be needed in future
# versions of this code:
vals, vecs = vals[idx], vecs[:, idx]

# In this case, we actually want the second eigenvector to be the x-axis
vecs = vecs[:, [1, 0, 2]]

# Now let's perform a change-of-basis into the new coordinate system
return np.linalg.inv(vecs).dot(xyz)

并绘制结果:

def main():
x, y, z = generate_data()
plot(*reorient(x, y, z))
plt.show()

enter image description here

请注意:我已经隐含地假设您的数据已经以将发生旋转的点为中心。如果不是这种情况,您需要在计算协方差矩阵之前减去旋转点(例如均值),然后在基础更改后将其加回去。

关于python - 寻找 3D 曲面的开口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com