微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将点沿法向量移动到python中的曲线 计算法线的方法计算法线的代码

如何解决如何将点沿法向量移动到python中的曲线 计算法线的方法计算法线的代码

我有一道相对简单的数学题。我有一个在二维空间中带有点的向量。还有一个使用样条表示的 2D 曲线。现在我想沿着法向量移动点。点和曲线如图1所示。另外我想知道这些点与图中法线方向曲线的距离。

我正在尝试解决 Python 和 numpy 库中的问题。不幸的是,我是一个初学者。有没有人对我有想法,如何计算单个点和曲线之间法线方向的距离?

非常感谢

解决方法

我将问题分为两个问题:1) 找到曲线的法线(点),2) 找到线和样条的交点。

第一个很简单:取两个连续的点,找到phi = atan2((y2 - y1) / (x2 - x1))——它的x轴与切线的夹角,psi = phi +- pi / 2是曲线与法线的夹角,求解y1 = tan(psi) * x1 + b为b你得到线方程 y = tan(psi) * x + b

第二个更复杂。您可以在此 question 中尝试解决方案。我会尝试沿着那条线找到两个点,该点高于和低于样条曲线和平分直到相交,但我不清楚找到这两个点的方法。或者,您可以尝试在直线的两侧找到样条曲线的两个点,然后将它们平分。

,

计算法线的方法

在 2D 中,法线是与切线正交的任何向量。对于大多数流行的样条,切线有一个封闭形式。如果你没有那个,你可以用数字计算。

数值计算:对于函数 p(s),它返回样条上的点作为标量 stangent_at_s = (p(s + e) - p(s - e)) / (2 * e) 的函数,其中 e 是一个很小但非零的数字。说1e-6

您可以通过旋转 tangent_at_s 90 度来获得法线向量。在 2D 中,这很简单:normal_at_s = [-tangent_at_s.y,tangent_at_s.x]。除以 n 的范数得到单位法线。

计算法线的代码

import numpy as np

def p(s):
   '''p(s) returns an np.array of size 2. A point on the spline.
   s + e is a different point for all s within the spline,and nonzero e. 
   '''
   return a_point_on_the_spline

def get_unit_normal(p,s):
    # Compute tangent by central differences. You can use a closed form tangent if you have it.
    tangent_at_s = (p(s + e) - p(s - e)) / (2 * e)
    normal_at_s = np.array([-tangent_at_s[1],tangent_at_s[0]])
    unit_normal_at_s = normal_at_s / np.linalg.norm(normal_at_s)

my_normal = get_unit_normal(p,0.1)

要沿法向量平移 p(s) 处的点,您只需构造一个点 p'(s) = p(s) + d_along_normal * get_unit_normal(p,s)。到原点的距离是norm(p'(s) - p(s))

一般曲线距离

点和曲线之间的最短线段始终垂直于曲线,或连接到曲线端点之一。您可以通过在曲线上几乎间隔开的点上进行迭代,并找到曲线上与查询点的距离最小的点来计算合适的近似值。

为了更准确的估计,您可以检查大间距,然后使用牛顿法在曲线的小段中找到最小值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。