首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何找到三角形之间的仿射变换?

如何找到三角形之间的仿射变换?
EN

Stack Overflow用户
提问于 2016-07-15 02:38:27
回答 1查看 1.2K关注 0票数 2

使用Matlab,我试图解决6个三角形的仿射变换(见AAprime)。

A中有3个三角形

代码语言:javascript
运行
复制
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中还有三个三角形。

代码语言:javascript
运行
复制
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映射到Aprim的triangle3的仿射变换。

问题#1:在我的代码中,tform只给出仿射变换t3。我不知道如何改变它来了解t1,t2,t3的仿射变换。

问题#2:我的另一个问题是,在tform矩阵中,哪些元素是平移、旋转、缩放值?如何找到标度、旋转角度和平移值?

有人能帮我更正下面的matlab代码吗?如何求解t1t2t3

我的代码是:

代码语言:javascript
运行
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-16 00:20:45

#1:,这是因为您试图将所有转换结构存储在一个变量中。试试这个:

代码语言:javascript
运行
复制
tform(i) = maketform('affine', ...);

#2:转换矩阵存储在tform(i).data.T中。是关于它的元素的文档。但在您的例子中,转换矩阵实际上是基本仿射变换的矩阵乘法 (平移、旋转、缩放和剪切)的结果。例如,我们不能说第一个元素显示沿x轴的尺度值或旋转角度的余弦。

另一个问题是,您说要将A的每个三角形映射到Aprim的三角形,但是代码似乎恰恰相反。我编辑了您的代码以测试结果:

代码语言:javascript
运行
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38387050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档