Math 两直线段间的变换矩阵

Math 两直线段间的变换矩阵,math,matrix,Math,Matrix,具有由四个端点定义的两条线段(在同一2D平面中)a、b、c和d如何计算将第一条线段转换为第二条线段的转换矩阵 我发现答案几乎就是我所需要的-我只是无法将其转换为代码。假设x、y轴上的比例因子相同,您可以:计算旋转角度: ang = acos(dot(b-a,d-c)/|b-a|*|d-c|) 和规模: scale = |d-c|/|b-a| 用原点=(0,0)构造2D同伦3x3变换矩阵,然后用它将a转换为c',并通过以下方式进行翻译: translate = d-d' 另一个选择是用代数方

具有由四个端点定义的两条线段(在同一2D平面中)
a
b
c
d
如何计算将第一条线段转换为第二条线段的转换矩阵


我发现答案几乎就是我所需要的-我只是无法将其转换为代码。

假设x、y轴上的比例因子相同,您可以:计算旋转角度:

ang = acos(dot(b-a,d-c)/|b-a|*|d-c|)
和规模:

scale = |d-c|/|b-a|
原点=(0,0)
构造2D同伦3x3变换矩阵,然后用它将
a
转换为
c'
,并通过以下方式进行翻译:

translate = d-d'
另一个选择是用代数方法求解:

M * p = p'
其中
M
3x3同伦变换矩阵

    | m0 m1 m2 |
M = | m3 m4 m5 |
    |  0  0  1 | 
p=(x,y,1)
是原点
(a,b)
p'=(x,y,w)
是转换点
(c,d)
,因此它形成了这个线性系统:

m0.ax + m1.ay + m2 = cx
m3.ax + m4.ay + m5 = cy
m0.bx + m1.by + m2 = dx
m3.bx + m4.by + m5 = dy
m0.ux + m1.uy + m2 = vx
m3.ux + m4.uy + m5 = vy
ux = 0.5*(ax+bx)
uy = 0.5*(ay+by)
vx = 0.5*(cx+dx)
vy = 0.5*(cy+dy)
所以只要解出
m0,m1,m2,m3,m4,m5
就得到了矩阵

有关更多信息,请参阅:


查找段的长度
len_ab,len_cd

通过
(-a.x,-a.y)转换矩阵

角度旋转矩阵

 atan2((d.x-c.x)*(b.y-a.y)-(d.y-c.y)*(b.x-a.x), 
       (d.x-c.x)*(b.x-a.x)+(d.y-c.y)*(b.y-a.y)
用系数
len_cd/len_ab按两个轴缩放


根据
(c.x,c.y)

这将是一个不同的答案,这取决于线段是在同一个二维平面还是三维空间中。如果是前者,那就是简单的平移和旋转。如果是后者,则是平移和三个连续旋转。这些矩阵很容易用旋转角度表示。线段在同一个2D平面上,缩放也相关。旋转变换是酉的,没有缩放问题。使用叉积计算旋转角度的正弦,并在旋转矩阵中使用它:@duffymo您能帮助实现吗?可以吗?对我会吗?不,我做了一个小演示。角度有点问题,所以我的计算有点不同。也许角度是相反的,试着否定它。ans很酷。注意:对于某些代码(不是js),您可能需要angle/PI*180。