我有两个段 AB和CD(红色)。这两个部分面对面。它们并不完全平行,但也不会彼此垂直。
由此,我需要找到彼此相对的这两个法线(蓝色)(即两个法线在ABCD之外)。我知道如何计算段的法线,但显然每个段有两个法线,我无法弄清楚如何以编程方式选择我需要的。有什么建议吗?
答案 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,则可以检测平行度。正值表示两者都显示在同一方向,负值表示两者都显示在不同的方向。
法线不平行:对于普通x(t) = x0 + t * n
,将行参数化为n
并计算两者相交的t
。否定t
表示两者都显示在外面。如果您对其中一个法线执行此操作就足够了,因为您在步骤1中将组合从4减少到2.
如果两个法线都是parralel:计算法线达到段之间中点的时间t
。如果你在其中一个法线上执行此操作就足够了,因为在步骤1中将组合从4减少到2。