这是第一次做仿射变换的题目,搞了一下午。
题意:给你一系列对点的平移,缩放,绕任意轴旋转的操作,然后给你点要求对所有点都进行这些操作,输出操作后所有点的坐标。
如果把每个点对每个操作依次进行变换会超时,因为有重复操作最大是2^32次操作。可以把对坐标的操作转换成矩阵乘以矩阵,这个操作是仿射变换。
例如:
1 0 0 tx x x+tx
0 1 0 ty * y = y+ty
0 0 1 tz z z+tz
0 0 0 1 1 1
缩放与旋转也是同理 不过旋转是抄袭网上某大神导出的公式
以下是仿射变换矩阵:
平移
translate tx ty tz
1 0 0 tx
0 1 0 ty
0 0 1 tz
0 0 0 1
缩放
scale a b c
a 0 0 0
0 b 0 0
0 0 c 0
0 0 0 1
绕任意轴(过原点)旋转(注意要把轴向量归一化,否则点在旋转轴上时有问题)
rotate x y z d
(1-cos(d))*x*x+cos(d) (1-cos(d))*x*y-sin(d)*z (1-cos(d))*x*z+sin(d)*y 0
(1-cos(d))*y*x+sin(d)*z (1-cos(d))*y*y+cos(d) (1-cos(d))*y*z-sin(d)*x 0
(1-cos(d))*z*x-sin(d)*y (1-cos(d))*z*y+sin(d)*x (1-cos(d))*z*z+cos(d)
题意:给你一系列对点的平移,缩放,绕任意轴旋转的操作,然后给你点要求对所有点都进行这些操作,输出操作后所有点的坐标。
如果把每个点对每个操作依次进行变换会超时,因为有重复操作最大是2^32次操作。可以把对坐标的操作转换成矩阵乘以矩阵,这个操作是仿射变换。
例如:
1 0 0 tx x x+tx
0 1 0 ty * y = y+ty
0 0 1 tz z z+tz
0 0 0 1 1 1
缩放与旋转也是同理 不过旋转是抄袭网上某大神导出的公式
以下是仿射变换矩阵:
平移
translate tx ty tz
1 0 0 tx
0 1 0 ty
0 0 1 tz
0 0 0 1
缩放
scale a b c
a 0 0 0
0 b 0 0
0 0 c 0
0 0 0 1
绕任意轴(过原点)旋转(注意要把轴向量归一化,否则点在旋转轴上时有问题)
rotate x y z d
(1-cos(d))*x*x+cos(d) (1-cos(d))*x*y-sin(d)*z (1-cos(d))*x*z+sin(d)*y 0
(1-cos(d))*y*x+sin(d)*z (1-cos(d))*y*y+cos(d) (1-cos(d))*y*z-sin(d)*x 0
(1-cos(d))*z*x-sin(d)*y (1-cos(d))*z*y+sin(d)*x (1-cos(d))*z*z+cos(d)