【发布时间】:2021-01-17 03:12:23
【问题描述】:
我有一个复杂的几何问题。
我有两个系列的点,由它们的 x、y 和 z 表示为 numpy 数组(实际上我在每个系列中有数千个,但为了更好地理解,在这里简单化)。
第一个数据集 (arr_1) 表示切割表面。该表面通常是垂直的并取代水平表面。第二组是被一个表面(arr_1 所代表的表面)置换的垂直表面的点。目前我在这两组中有一些冗余数据。首先,在arr_1 中,我更喜欢只有四个角点并自己使用它们制作一个曲面。其次,在arr_2 中我也不需要太接近arr_1 的数据。最后,我想终止由arr_1 的四个角构成的曲面两侧的点。
import numpy as np
arr_1= np.array ([[31.95548952, 7.5 , 12.5 ],
[31.95548952, 22.5 , 12.5 ],
[37.5 , 7.5 , 24.20636043],
[37.5 , 22.5 , 24.20636043],
[43.78154278, 7.5 , 37.5 ],
[43.78154278, 22.5 , 37.5 ],
[55.32209575, 7.5 , 62.5 ],
[55.32209575, 22.5 , 62.5 ],
[62.5 , 7.5 , 78.50696445],
[62.5 , 22.5 , 78.50696445],
[66.52446985, 7.5 , 87.5 ],
[66.52446985, 22.5 , 87.5 ]])
arr_2= np.array([[87.5 , 7.5 , 49.99997914],
[87.5 , 22.5 , 50.00001192],
[62.5 , 7.5 , 50.00004172],
[62.5 , 22.5 , 50.00007749],
[46.8747884 , 7.5 , 62.5 ],
[46.87483609, 22.5 , 62.5 ],
[37.5 , 7.5 , 69.99973059],
[37.5 , 22.5 , 69.99977231],
[12.5 , 7.5 , 70.00012398],
[12.5 , 22.5 , 70.00015974]])
然后,我使用以下代码找到这两个数组的每组之间的距离:
from scipy.spatial import distance
distances=distance.cdist(arr_1, arr_2)
当我运行它时,distances 是一个包含 12 行和 10 列的数组。
现在,我想删除arr_2 的点,它们比阈值(比如说10)更接近arr_1 的任何点。在第一张上传的照片中,我在黑色矩形中显示了这两个点。提出了一个很好的解决方案here,但是并没有解决我的问题,因为我想比较arr_1的每一行与arr_2的每一行的距离。我很感激任何解决方案。
事实上,arr_1 包含曲面的点,但我不需要所有这些点来制作我的曲面。我只挑选这组的角落来制作我的表面。我使用了一个非常耗时的 for 循环,所以我很欣赏任何更快的方法来找到我的观点的角落:
corner1 = np.array(arr_1.min (axis=0)) # this gives the row containing MIN values of x,y and z
corner2 = np.array([])
corner4 = np.array([])
corner3 = np.array(arr_1.max (axis=0)) # this gives the row containing MAX values of x,y and z
# the next block will find the corner in which x and y are minimum and z is maximum
for i in arr_1[:,0]:
if i == max (arr_1[:,0]):
for j in arr_1[:,1]:
if j == min (arr_1[:,1]):
for h in arr_1[:,2]:
if h == max (arr_1[:,2]):
corner2 = np.append(corner2, np.array([i,j,h]))
corner2=corner2[0:3]
# the next block will find the corner in which x and z are minimum and y is maximum
for m in arr_1[:,0]:
if m == min (arr_1[:,0]):
for n in arr_1[:,1]:
if n == max (arr_1[:,1]):
for o in arr_1[:,2]:
if o == min (arr_1[:,2]):
corner4 = np.append(corner4, np.array([m,n,o]))
corner4=corner4[0:3]
最后,在提取四个角后,我想用它们做一个曲面,并在其上找到 arr_2 相邻点的垂直(绿色箭头)或水平(红色箭头)投影。我不知道如何找到表面和投影。 感谢您阅读并关注我的详细问题!如果有人对它的任何部分提出任何解决方案,我将不胜感激。
【问题讨论】:
-
好问题 - 我认为3-point plane theorem 中可能有一些里程数,因此您可以随机选择任意 3 个点和determine your plane from those,而不是选择 4 个角。如果您的数据中有噪音,那么您可能需要运行几个样本并就最具特征的点集达成一致,作为到达基线平面的更快方法。
-
第一部分你可以用
arr_2[np.where(np.min(distance.cdist(arr_1, arr_2),axis=0)>10)[0],:]去掉最近的点 -
对于角落,一个选项可以与您的示例输入一起使用(但如果重新分区不是对称的,则可能不会使用更多点)可能是
idx = np.argsort(distance.cdist([np.mean(x1,axis=0)],x1)).flatten()[0:4]。我们将 4 个最远的点与所有点的质心进行比较。 -
明确一点,您是在寻找两个平面的交点吗?
-
亲爱的@疯狂物理学家,是的。没错。我想知道我的 arr_2 在哪里切割 arr_1。他们两次遇到这个切割表面。一个平面是通过连接四个角创建的,但另一个平面只是靠近这个表面的点。