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

时间:2011-09-21 07:33:06

标签: math graphics vector geometry normals

我有两个 AB和CD(红色)。这两个部分面对面。它们并不完全平行,但也不会彼此垂直。

由此,我需要找到彼此相对的这两个法线(蓝色)(即两个法线在ABCD之外)。我知道如何计算段的法线,但显然每个段有两个法线,我无法弄清楚如何以编程方式选择我需要的。有什么建议吗?

enter image description here

3 个答案:

答案 0 :(得分:1)

计算两个段的中点之间的向量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 :(得分:1)

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

案例1 :行之间的交叉发生在任一段的端点之外。

在这种情况下,由@Michael J. Barber建议的中点方法肯定会起作用。因此,在段的中点之间形成一个向量,用这个中点向量计算法向量的点积并检查符号。

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

案例2 :行间的交点发生在一个段的端点内。

在这种情况下,在包围交叉点的段的任何一个端点与交叉点本身之间形成一个向量。

包含交叉点的段的法线的点积,此新向量应为+ve

您可以通过要求两个法线之间的点积为-ve(在垂直线段的情况下只是模糊不清)来找到另一个线段的向外法线。

我假设这些段不是共线的或实际上是相交的。

希望这有帮助。

答案 2 :(得分:0)

您可以按照以下方式减少标志的四种组合:

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

    由于我认为你的法线具有单位长度,如果点积为1,则可以检测平行度。正值表示两者都显示在同一方向,负值表示两者都显示在不同的方向。

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

  3. 如果两个法线都是parralel:计算法线达到段之间中点的时间t。如果你在其中一个法线上执行此操作就足够了,因为在步骤1中将组合从4减少到2。