首先表达a1*(x-x0)+b1*(y-y0)=0 和a2*(x-x0)+b2*(y-y0)=0 之类的行,它们的交集x0,y0 已经在方程式中说明了。
更新标志
从x,y 到z,w 的转换是
z = -sqrt(a1^2+b1^2)*(a2*(x-x0)+b2*(y-y0))/(a2*b1-a1*b2)
w = sqrt(a2^2+b2^2)*(a1*(x-x0)+b1*(y-y0))/(a1*b2-a2*b1)
反之
x = x0 - b1*z/sqrt(a1^2+b1^2) + b2*w/sqrt(a2^2+b2^2)
y = y0 + a1*z/sqrt(a1^2+b1^2) - a2*w/sqrt(a2^2+b2^2)
将系数缩放为sqrt(a1^2+b1^2)=1 和sqrt(a2^2+b2^2)=1 会很有帮助。
请注意,这也适用于非正交线。只要它们不是平行的并且a2*b1-a1*b2!=0 它就可以工作。
示例
z 线 (-2)*(x-3) + (1)*(y-1) = 0 和 w 线 (-1)*(x-3) + (-4)*(y-1) = 0 在 (3,1) 见面。因此系数为a1=-2、b1=1、a2=-1、b2=-4。
坐标(x,y)=(2,1)变换为
z = -sqrt((-2)^2+1^2) ((-1) (x-3)+(-4) (y-1))/((-1) 1-(-2) (-4)) = 0.2484
w = sqrt((-1)^2+(-4)^2) ((-2) (x-3)+1 (y-1))/((-2) (-4)-(-1) 1) = 0.9162
逆向
x = -1 z/sqrt((-2)^2+1^2)+(-4) w/sqrt((-1)^2+(-4)^2)+3 = 2
y = (-2) z/sqrt((-2)^2+1^2)-(-1) w/sqrt((-1)^2+(-4)^2)+1 = 1
发展
对于一条线a1*(x-x0)+b1*(y-y0)=0,沿该线的方向向量是e1 = [e1x,e1y]= [-b1/sqrt(a1^2+b1^2),a1/sqrt(a1^2+b1^2)]。另一行也是如此。
本地点[z,w] 的屏幕坐标是从原点x0、y0 开始,沿第一行移动z,然后沿第二行移动w。所以
x = x0 + e1x*z + e2x*w = x0 -b1/sqrt(a1^2+b1^2)*z - b2/sqrt(a2^2+b2^2)*w
y = y0 + e1y*z + e2y*w = y0 +a1/sqrt(a1^2+b1^2)*z + a2/sqrt(a2^2+b2^2)*w
现在我需要翻转第二行的方向,使其按照原始发布可视化的方式工作,方法是反转 w 的符号。
要从x、y 中找到z、w,将上述两个等式反转。