Math 如何找到两条相反的法线或两条线段?

Math 如何找到两条相反的法线或两条线段?,math,graphics,vector,geometry,normals,Math,Graphics,Vector,Geometry,Normals,我有一个红色的两段AB和CD。这两个部分相互面对。它们不是完全平行的,但也永远不会相互垂直 由此,我需要找到这两条蓝色线段的两条法线,它们彼此相对,即两条法线位于ABCD之外。我知道如何计算线段的法线,但很明显,每个线段都有两条法线,我不知道如何通过编程选择所需的法线。有什么建议吗 计算两段中点之间的向量v,从AB指向CD。现在,期望法线到AB到v的投影必须为负,期望法线到CD到v的投影必须为正。因此,只需计算法线,对照v进行检查,如果需要使法线满足条件,则对其求反 这是Python的版本: #

我有一个红色的两段AB和CD。这两个部分相互面对。它们不是完全平行的,但也永远不会相互垂直

由此,我需要找到这两条蓝色线段的两条法线,它们彼此相对,即两条法线位于ABCD之外。我知道如何计算线段的法线,但很明显,每个线段都有两条法线,我不知道如何通过编程选择所需的法线。有什么建议吗


计算两段中点之间的向量v,从AB指向CD。现在,期望法线到AB到v的投影必须为负,期望法线到CD到v的投影必须为正。因此,只需计算法线,对照v进行检查,如果需要使法线满足条件,则对其求反

这是Python的版本:

# use complex numbers to define minimal 2d vector datatype
def vec2d(x,y): return complex(x,y)
def rot90(v): return 1j * v
def inner_prod(u, v): return (u * v.conjugate()).real

def outward_normals(a, b, c, d):
    n1 = rot90(b - a)
    n2 = rot90(d - c)
    mid = (c + d - a - b) / 2
    if inner_prod(n1, mid) > 0:
        n1 = -n1
    if inner_prod(n2, mid) < 0:
        n2 = -n2
    return n1, n2

注意,我假设端点定义了满足问题条件的线。当直线具有相同的中点时,我也不检查边缘情况;在那种情况下,外部的概念不适用

您可以按如下方式减少符号的四种组合:

计算法线的点积,负号表示两者都显示在外部或内部

我假设法线有单位长度,如果点积的大小为1,则可以检测平行性。正值表示两者显示在同一方向,负值表示两者显示在不同方向

如果法线不平行:将线参数化为xt=x0+t*n表示法线n,并计算两者相交的t。负t表示两者都显示在外部。如果您对其中一条法线执行此操作就足够了,因为您在步骤1中将组合从4减少到2

如果两条法线都是平行的:计算法线到达两条线段之间中点的时间t。如图2所示。如果您对其中一条法线执行此操作,就足够了,因为您在步骤1中将组合从4减少到2


我认为有两种情况需要考虑:

情况1:直线之间的交点出现在任一线段的端点之外

在这种情况下,@Michael J.Barber建议的中点法肯定会奏效。在线段的中点之间形成一个向量,用这个中点向量计算法向量的点积,然后检查符号

如果要计算lineA的法线,则法线与向量midB->midA的点积应为+ve

情况2:直线之间的交点出现在一条线段的端点内

在这种情况下,在不包含交点的线段的任一端点和交点本身之间形成向量

包含交点的线段的法线的点积和该新向量应为+ve

通过要求两条法线之间的点积为-ve,可以找到另一条线段的向外法线,这仅在垂直线段的情况下是不明确的

我假设这些线段不是共线的,也不是相交的


希望这能有所帮助。

我不认为这会一直奏效,尽管它适用于所有的案例。如果一个线段的端点位于另一个线段的相对侧,那么中点实际上可能位于错误的一侧…@Darren有趣的点,我假设不相交。不过,我还没有找到一个与我所建议的方法相反的例子,只是在某些情况下,正确的选择还不清楚。如果您考虑了一个特定的情况,那么给出端点会有所帮助。请尝试第1行=0,0->1,0.25和第2行=1.25,-0.25->2,2。如果我正确理解你的方法,我想这会给第1行提供错误的法线。@Darren Engwirda,这是我提到的不清楚的选择之一。线之间的角度是钝角,这使得所需法线有点不清楚;所需法线可以有一个正内积在外,也可以有一个负内积在外。我建议的方法是外部选择。正如Laurent所说,线段之间的角度总是尖锐的,这在这里并不重要,但如果其他读者对更一般的情况感兴趣,这是一个很好的观点。当线段形成钝角时,你想做什么?这样一来,外部和相对位置就不一样了。@Michael J.Barber,这不会发生,因为线段之间的角度总是<90°。