曲面法向量对齐算法

2024-06-16 11:57:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我在曲面上有一些点(我没有数学公式)。你知道吗

我有一个算法,可以给我曲面的法向量(实际上,它和给我点的是同一个),但是,不幸的是,法向量没有“对齐”。你知道吗

我的意思是,返回法向量n的算法任意返回n-n。没有办法说,先验的,我已经收到了。这不一定是个问题,但我的向量场图看起来很糟糕,因为两个相邻的点可能有指向相反方向的向量。因此,我想“对齐”我的法向量,在某种意义上,我想让它们中的大多数都反映出物体的相同方向(即指向“向外”的所有点或指向“向内”的所有点)

我意识到这不可能有完美的公式,但我有一个困难的时间开发一个算法,即使是半途而废的工作。你知道吗

我当前的算法取当前点最近的k点,确定当前法向量与这些k点的法向量对齐的程度(通过点积),求平均值,如果它与相邻点“不对齐”,则翻转向量。我将这个过程迭代了几次,以允许不同点的邻域之间的交互。你知道吗

以下是迄今为止的代码:

import sklearn.neighbors
import numpy as np

def align_normals(data, normals, k=10, iterations=10):
    balltree = sklearn.neighbors.BallTree(data)
    pairwise_nearest_indices = balltree.query(data,k=k,sort_results=True,return_distance=False)
    for iteration in range(iterations):
        alignments = []
        for index in range(1,pairwise_nearest_indices.shape[1]):
            alignment = np.einsum("ij,ij->i",normals,normals[pairwise_nearest_indices[:,index]])
            alignments.append(alignment)
        alignment = np.average(alignments, axis=0)
        wrong_alignment = np.sign(alignment)
        normals = normals*wrong_alignment.reshape(-1,1)
    return normals

我突然想到,曲面“末端”的点可以很容易地对齐,指向外部,然后迭代地对齐这些点附近的向量。然而,到目前为止,我所有的想法似乎都是一派胡言。你知道吗

有没有人对对齐法向量有什么好主意?你知道吗


Tags: import算法datanpsklearn方向向量alignment