from sklearn import decomposition
def isPlaneLine(XYZ):
'''
XYZ is n x 3 metrix storing xyz coordinates of n points
It uses PCA to check the dimensionality of the XYZ
th is the threshold, the smaller, the more strict for being
planar/linearity
return 0 ==> randomly distributed
return 1 ==> plane
return 2 ==> line
'''
th = 1e-3
pca = decomposition.PCA()
pca.fit(XYZ)
pca_r = pca.explained_variance_ratio_
t = np.where(pca_r < th)
return t[0].shape[0]
可以使用主成分分析(PCA)检查三维曲面是否平坦(如果是平面/直线),可以尝试以下代码:
首先,三维空间中的所有直线都对应于一个方程;其次,三维空间中的所有直线在其长度的一部分上对应于属于一组线性方程组的方程组,这些方程组具有某些特征,您需要确定这些方程组。首先你要做的是确定假设平面的四个角,它们的x,y或z值比其他点更极端。然后检查角点之间的直线在集合中是否有方程-三维中的三个点总是定义一个平面,四个点可能没有。然后你应该用适当的线性方程来“绘制”两条平行边的点。假设平面上的所有其他点都是垂直于两条平行边之间的“在线”(其方程也在集合中)。两边垂直线的两个端点将定义每个等式。当确定一个点是否在一条直线上时,最关键的一点是它可能不是,即使假设的平面是作为一个平面输入的。这是因为由方程生成的x、y和z值将四舍五入,以便与图形程序允许的分辨率定义的“实”点相对应。因此,你必须考虑到一个点“应该在哪里”和它实际在哪里之间的一个(非常小的)差异-这可能只是一个像素(或使用的任何分辨率单位)。从另一个角度看,一个点可能在两个边之间的垂直线上,但不在另两个边之间的垂直线上,这仅仅是因为两个方程中的一个有舍入误差。如果你想测试一个“颠簸”的飞机,不管出于什么原因,只要增加允许的偏差。如果你发布了一个措辞严谨的问题,关于平面上直线的方程组math.stackexchange.com网站有人可能知道的更多。在
相关问题 更多 >
编程相关推荐