如何解决如何将点沿法向量移动到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)
,它返回样条上的点作为标量 s
、tangent_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 举报,一经查实,本站将立刻删除。