ChatGPT解决这个技术问题 Extra ChatGPT

如何计算线段的法向量? [关闭]

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。这个问题似乎与帮助中心定义的范围内的编程无关。 6 个月前关闭。社区在 6 个月前审查了是否重新打开此问题并将其关闭:原始关闭原因未解决 改进此问题

假设我有一条从 (x1,y1) 到 (x2,y2) 的线段。如何计算垂直于线的法向量?

我可以找到很多关于为 3D 飞机执行此操作的内容,但没有 2D 内容。

请在数学上轻松一点(欢迎提供工作示例、图表或算法的链接),我是一名程序员,而不是一名数学家;)

如果你想知道这背后的“数学”,你可以在 stackoverflow.com/a/7470098/189767 上查找我的答案。它基本相同,但更精细。
这个问题是关于数学的,而不是编程的。
我投票结束这个问题,因为它是关于数学,而不是编程。

f
funie200

如果我们定义 dx = x2 - x1dy = y2 - y1,那么法线是 (-dy, dx)(dy, -dx)

请注意,不需要除法,因此您不会冒被零除的风险。


这很微妙,我花了一段时间才意识到 normal.x = -dy 和 normal.y = dx。我把它们反过来了,因为它看起来像是一个错字,将 x 部分分配给 y 值......
您能否详细介绍一下三角洲在这里的作用?我确定我在这里遗漏了一些东西。
@legends2k:增量是切向量。法线是垂直于切线的方向。如果您查看 90 度旋转的 2D 矩阵,则翻转 x/y 值并取反变得显而易见:en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
@Oren Trutner 结果的长度是否为一?
最初的答案是正确的——法线向量不一定是单位向量。我在上面添加/建议了一个澄清句,以使其更清晰一些。
d
duffymo

另一种思考方式是计算给定方向的单位矢量,然后逆时针旋转 90 度以获得法线矢量。

一般二维变换的矩阵表示如下:

x' = x cos(t) - y sin(t)
y' = x sin(t) + y cos(t)

其中 (x,y) 是原始向量的分量, (x', y') 是变换后的分量。

如果 t = 90 度,则 cos(90) = 0 且 sin(90) = 1。将其代入并相乘得出:

x' = -y
y' = +x

与前面给出的结果相同,但对它的来源进行了更多解释。


非常感谢,我不知道它是如何派生的。
虽然我之前知道旋转公式,但这个答案在我脑海中点击的是角度是一个常数(+/- 90),这将其简化为 x 和 y 的简单否定和反转。
@duffymo 结果的长度是否为 1?
如果向量在转换之前被归一化,它将在之后保持如此。您必须在进行旋转变换之前或之后进行归一化。
T
Tu Bui

这个问题很久以前就已经发布了,但我找到了另一种方法来回答它。所以我决定在这里分享。
首先,必须知道:如果两个向量垂直,则它们的点积为零。
法向量(x',y')垂直于连接(x1,y1)和{的线3}。这条线的方向是 (x2-x1,y2-y1)(dx,dy)
所以,

(x',y').(dx,dy) = 0
x'.dx + y'.dy = 0

有很多对 (x',y') 满足上述等式。但始终满足的最佳配对是 (dy,-dx)(-dy,dx)


u
ufukgun
m1 = (y2 - y1) / (x2 - x1)

如果垂直两条线:

m1*m2 = -1

然后

m2 = -1 / m1 //if (m1 == 0, then your line should have an equation like x = b)

y = m2*x + b //b is offset of new perpendicular line.. 

如果你想从你定义的点传递它