【问题标题】:How do I create a line that is perpendicular to a plane of coordinates如何创建垂直于坐标平面的线
【发布时间】:2019-09-20 12:53:36
【问题描述】:

我有三个坐标(X、Y 和 X)数据集(numpy 数组)代表一个平面。我需要创建一条垂直于平面的线。

我从另一个文件中获取数据,因为我无法轻松与您分享,所以我创建了一个随机 pandas 数据集,用于生成数据表面的代码如下:

cor_CTV = pd.DataFrame(np.random.randint(0,100,size=(100, 3)), columns = list('xyz'))

linear_data = np.c_[cor_CTV["x"], cor_CTV["y"], cor_CTV["z"]]
mn = np.min(linear_data, axis=0)
mx = np.max(linear_data, axis=0)
X,Y = np.meshgrid(np.linspace(mn[0], mx[0], 20), np.linspace(mn[1], mx[1], 20))

XX = X.flatten()
YY = Y.flatten()

A = np.c_[linear_data[:,0], linear_data[:,1], np.ones(linear_data.shape[0])]
C,_,_,_ = scipy.linalg.lstsq(A, linear_data[:,2])
Z = C[0]*X + C[1]*Y + C[2]

如果有人能帮助我,我将不胜感激。

【问题讨论】:

标签: python coordinates line surface plane


【解决方案1】:

你可以使用任意两个非共线点的相对位置的叉积:

O = np.array([X[0][0], Y[0][0], Z[0][0]])   # Corner to be used as the origin

V1 = np.array([X[1][0], Y[1][0], Z[1][0]]) - O  # Relative vectors
V2 = np.array([X[0][1], Y[0][1], Z[0][1]]) - O

V1 = V1 / scipy.linalg.norm(V1)  # Normalise vectors
V2 = V2 / scipy.linalg.norm(V2)

# Take the cross product
perp = np.cross(V1, V2)

示例结果:

[ 0.18336919 -0.0287231  -0.98260979]

【讨论】:

  • 相对于我的曲面角的两个向量彼此不垂直。当我取两个向量的叉积时,它不会给我垂直于其他两个向量的向量。
  • 嗨,这两个向量(V1V2)不必垂直。只要它们不是共线的,perp (V1 x V2) 将始终垂直于两者。这两个向量定义了一个平面,叉积垂直于该平面。您可以在此处阅读有关cross product 的更多信息。 (V1V2 彼此成 90° 以外的角度的唯一影响是叉积的长度)
  • 谢谢,我发现了我犯的错误。我图中的轴比例不相等。这就是为什么我的向量看起来并不相互垂直,而实际上它们是垂直的。愚蠢的错误,谢谢
  • 总是乐于提供帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2020-08-22
相关资源
最近更新 更多