如何找到三角形之间的仿射变换?
How to Find Affine Transform Between Triangles?
我正在尝试使用 Matlab 求解 6 个三角形的仿射变换(参见 A
和 Aprime
)...
3 个三角形在 A
triangle1: points 1,2,3 of A
triangle2: points 4,5,6 of A
triangle3: points 7,8,9 of A
其中 A 的 X/Y 坐标为:
A.x = [x1 x2 x3; x4 x5 x6; x7 x8 x9]
和
A.y = [y1 y2 y3; y4 y5 y6; y7 y8 y9]
并且 Aprim
中还有 3 个三角形。
triangle5:points 1,2,3 of Aprim
triangle6:points 4,5,6 of Aprim
triangle7:points 7,8,9 of Aprim
Aprim 的 X/Y 坐标是:
Aprim.x = [xp1 xp2 xp3; xp4 xp5 xp6; xp7 xp8 xp9]
和 Aprim.y = [yp1 yp2 yp3; yp4 yp5 yp6; yp7 yp8 yp9]
我需要找到以这种方式将 A
的每个三角形映射到 Aprim
的三角形的仿射变换:
- t1是将A的triangle1映射到Aprim的triangle1的仿射变换
- t2是将A的triangle2映射到Aprim的triangle2的仿射变换
- t3是将A的点triangle3映射到triangle3的仿射变换
四月。
问题 #1:在我的代码中,tform 只给我仿射变换 t3。我不知道如何更改它以了解 t1、t2、t3 的仿射变换。
问题 #2 : 我的另一个问题是在 tform 矩阵中,哪些元素是平移值、旋转值、缩放值?如何找到缩放、旋转角度和平移值?
谁能帮我更正下面的 matlab 代码?如何解决t1,t2和t3?
我的代码是:
A.x=[309 367 295;273 268 298;295 367 298];
A.y=[292 259 277;228 253 225;277 259 225];
Aprim.x=[267 211 265;267 261 295;259 261 211];
Aprim.y=[301 222 325;301 270 306;213 112 222];
for i=1:3
A_xprim(1:3,i)= transpose(Aprim.x(i,1:3));
A_yprim(1:3,i)=transpose(Aprim.y(i,1:3));
Ax(1:3,i)= transpose(A.x(i,1:3));
Ay(1:3,i)=transpose(A.y(i,1:3));
tform = maketform('affine',[A_xprim(1:3,i) A_yprim(1:3,i)],[ Ax(1:3,i) Ay(1:3,i)]);
end
#1: 那是因为您试图将所有转换结构存储在一个变量中。试试这个:
tform(i) = maketform('affine', ...);
#2:变换矩阵存放在tform(i).data.T
中。和 this is the documentation about its elements. But in your case the transformation matrix is actually the result of matrix multiplication of basic affine transforms(平移、旋转、缩放和剪切)。例如,我们不能说第一个元素显示沿 x 轴的比例值或旋转角度的余弦值。
另一个问题是你说你想将A
的每个三角形映射到Aprim
的三角形,但是代码似乎反其道而行之。我编辑了您的代码以测试结果:
clc; clear; close all;
A.x=[309 367 295;273 268 298;295 367 298];
A.y=[292 259 277;228 253 225;277 259 225];
Aprim.x=[267 211 265;267 261 295;259 261 211];
Aprim.y=[301 222 325;301 270 306;213 112 222];
for i=1:3
Axprim(1:3,i)= transpose(Aprim.x(i,1:3));
Ayprim(1:3,i)=transpose(Aprim.y(i,1:3));
Ax(1:3,i)= transpose(A.x(i,1:3));
Ay(1:3,i)=transpose(A.y(i,1:3));
tform(i) = maketform('affine',[Ax(1:3,i) Ay(1:3,i)],[ Axprim(1:3,i) Ayprim(1:3,i)]);
end
[X, Y] = meshgrid(260:5:370, 220:5:300);
n = numel(X);
C = ones(n, 3);
[~, I] = sort(X(:)+Y(:));
C(I, 1) = linspace(0, 1, n);
C = hsv2rgb(C);
TX = [A.x A.x(:, 1)];
TY = [A.y A.y(:, 1)];
TPX = [Aprim.x Aprim.x(:, 1)];
TPY = [Aprim.y Aprim.y(:, 1)];
subplot(221); hold on; axis equal;
scatter(X(:), Y(:), 100, C, '.');
plot(TX', TY', 'linewidth', 2);
plot(TPX', TPY', '--', 'linewidth', 2);
xlabel('X'); ylabel('Y');
for i = 1:3
subplot(2, 2, i+1);
axis equal; hold on;
[U, V] = tformfwd(tform(i), X(:), Y(:));
scatter(U(:), V(:), 100, C, '.');
plot(TPX', TPY', 'linewidth', 2);
xlabel('U'); ylabel('V');
end
我正在尝试使用 Matlab 求解 6 个三角形的仿射变换(参见 A
和 Aprime
)...
3 个三角形在 A
triangle1: points 1,2,3 of A
triangle2: points 4,5,6 of A
triangle3: points 7,8,9 of A
其中 A 的 X/Y 坐标为:
A.x = [x1 x2 x3; x4 x5 x6; x7 x8 x9]
和
A.y = [y1 y2 y3; y4 y5 y6; y7 y8 y9]
并且 Aprim
中还有 3 个三角形。
triangle5:points 1,2,3 of Aprim
triangle6:points 4,5,6 of Aprim
triangle7:points 7,8,9 of Aprim
Aprim 的 X/Y 坐标是:
Aprim.x = [xp1 xp2 xp3; xp4 xp5 xp6; xp7 xp8 xp9]
和 Aprim.y = [yp1 yp2 yp3; yp4 yp5 yp6; yp7 yp8 yp9]
我需要找到以这种方式将 A
的每个三角形映射到 Aprim
的三角形的仿射变换:
- t1是将A的triangle1映射到Aprim的triangle1的仿射变换
- t2是将A的triangle2映射到Aprim的triangle2的仿射变换
- t3是将A的点triangle3映射到triangle3的仿射变换 四月。
问题 #1:在我的代码中,tform 只给我仿射变换 t3。我不知道如何更改它以了解 t1、t2、t3 的仿射变换。
问题 #2 : 我的另一个问题是在 tform 矩阵中,哪些元素是平移值、旋转值、缩放值?如何找到缩放、旋转角度和平移值?
谁能帮我更正下面的 matlab 代码?如何解决t1,t2和t3?
我的代码是:
A.x=[309 367 295;273 268 298;295 367 298];
A.y=[292 259 277;228 253 225;277 259 225];
Aprim.x=[267 211 265;267 261 295;259 261 211];
Aprim.y=[301 222 325;301 270 306;213 112 222];
for i=1:3
A_xprim(1:3,i)= transpose(Aprim.x(i,1:3));
A_yprim(1:3,i)=transpose(Aprim.y(i,1:3));
Ax(1:3,i)= transpose(A.x(i,1:3));
Ay(1:3,i)=transpose(A.y(i,1:3));
tform = maketform('affine',[A_xprim(1:3,i) A_yprim(1:3,i)],[ Ax(1:3,i) Ay(1:3,i)]);
end
#1: 那是因为您试图将所有转换结构存储在一个变量中。试试这个:
tform(i) = maketform('affine', ...);
#2:变换矩阵存放在tform(i).data.T
中。和 this is the documentation about its elements. But in your case the transformation matrix is actually the result of matrix multiplication of basic affine transforms(平移、旋转、缩放和剪切)。例如,我们不能说第一个元素显示沿 x 轴的比例值或旋转角度的余弦值。
另一个问题是你说你想将A
的每个三角形映射到Aprim
的三角形,但是代码似乎反其道而行之。我编辑了您的代码以测试结果:
clc; clear; close all;
A.x=[309 367 295;273 268 298;295 367 298];
A.y=[292 259 277;228 253 225;277 259 225];
Aprim.x=[267 211 265;267 261 295;259 261 211];
Aprim.y=[301 222 325;301 270 306;213 112 222];
for i=1:3
Axprim(1:3,i)= transpose(Aprim.x(i,1:3));
Ayprim(1:3,i)=transpose(Aprim.y(i,1:3));
Ax(1:3,i)= transpose(A.x(i,1:3));
Ay(1:3,i)=transpose(A.y(i,1:3));
tform(i) = maketform('affine',[Ax(1:3,i) Ay(1:3,i)],[ Axprim(1:3,i) Ayprim(1:3,i)]);
end
[X, Y] = meshgrid(260:5:370, 220:5:300);
n = numel(X);
C = ones(n, 3);
[~, I] = sort(X(:)+Y(:));
C(I, 1) = linspace(0, 1, n);
C = hsv2rgb(C);
TX = [A.x A.x(:, 1)];
TY = [A.y A.y(:, 1)];
TPX = [Aprim.x Aprim.x(:, 1)];
TPY = [Aprim.y Aprim.y(:, 1)];
subplot(221); hold on; axis equal;
scatter(X(:), Y(:), 100, C, '.');
plot(TX', TY', 'linewidth', 2);
plot(TPX', TPY', '--', 'linewidth', 2);
xlabel('X'); ylabel('Y');
for i = 1:3
subplot(2, 2, i+1);
axis equal; hold on;
[U, V] = tformfwd(tform(i), X(:), Y(:));
scatter(U(:), V(:), 100, C, '.');
plot(TPX', TPY', 'linewidth', 2);
xlabel('U'); ylabel('V');
end