簡體   English   中英

如何找到離線最近的點?

[英]How to find the nearest point to the line?

我有一個存儲為 numpy 數組的點雲。 還有一條線穿過用兩個點指定的點雲。

如何在最優化的版本中獲得最接近該線的點?

我已經一一計算了到每個點的距離,但是計算它需要很長時間,並且它凍結了我的應用程序....

請幫我優化它;(

這就是我對每一點的做法:

def isectSphere(self, p0, p1, cpt):

        # normalized ray direction
        r_dir = np.subtract(p0, p1)
        r_dir = r_dir / np.linalg.norm(r_dir)

        # nearest point on the ray to the sphere
        p0_cpt = np.subtract(p0, cpt)
        near_pt = np.subtract(p0, r_dir * np.dot(p0_cpt, r_dir))

        # distance to center point
        return np.linalg.norm(np.subtract(near_pt, cpt))

在每個點上迭代該代碼之后,a 一直在減少它。

在點雲中大約有 6 000 000 個點。

您可以使用矢量化計算:

假設p0p1的形狀為(m,)並且pc是形狀(N, m)的點雲數組,您可以使用np.cross來計算矢量化距離:

closest_point = pc[np.argmin(np.linalg.norm(np.cross(p1-p0, p0-pc, axisb=1), axis=1)/np.linalg.norm(p1-p0))]

在個人系統上,超過 6,000,000 點只需不到一秒的時間。

import numpy as np


def isectSphere(p0, p1, cloud):
        """
        >>> isectSphere([1, 0], [3, 0], [[0, -4], [2, 3]])
        1
        >>> isectSphere([1, 0, 0], [3, 0, 0], [[0, -4, 0], [2, 3, 0]])
        1
        """
        p0 = np.asarray(p0)
        p1 = np.asarray(p1)
        cloud = np.asarray(cloud)
        product = np.cross(cloud - p0, p1 - p0)
        if product.ndim == 2:
            distances = np.linalg.norm(product, axis=1)
        else:
            distances = np.abs(product)
        return distances.argmin()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM