% clc
% clear all
% close all
% 对三角形进行映射并变形填色
imtest=imread('test.bmp');
[m,n,k]=size(imtest);
imtest0=rgb2gray(imtest);
imchange=zeros(m,n,k);
in_point1=[192,78];
in_point2=[76,271];
in_point3=[273,284];
in_Triangle=[in_point1;in_point2;in_point3]; %原始图三角形角点坐标
point1=[156,150];
point2=[120,300];
point3=[380,110];
Triangle=[point1;point2;point3]; %变换后三角形角点坐标
minx=min(min(point1(1),point2(1)),point3(1));
maxx=max(max(point1(1),point2(1)),point3(1));
miny=min(min(point1(2),point2(2)),point3(2));
maxy=max(max(point1(2),point2(2)),point3(2));
v0 = point2-point1;
v1 = point3-point1;
v00 = in_point2 - in_point1;
v10 = in_point3 - in_point1;
for i=minx:maxx
for j=miny:maxy
P=[i,j]; %判断坐标点
v2 = P - point1;
% Compute dot products
dot00 = dot(v0, v0);
dot01 = dot(v0, v1);
dot02 = dot(v0, v2);
dot11 = dot(v1, v1);
dot12 = dot(v1, v2);
% Compute barycentric coordinates
invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
u = (dot11 * dot02 - dot01 * dot12) * invDenom;
v = (dot00 * dot12 - dot01 * dot02) * invDenom;
% Check if point is in triangle
if u >= 0 && v >= 0 && u + v <= 1
solu=u*v00+v*v10+in_point1;
i0=round(solu(1));
j0=round(solu(2));
imchange(j,i,:)=double(imtest(j0,i0,:));
end
end
end
figure;
imshow(imtest)
figure;
imshow(uint8(imchange))