实验原理:
(1)使用齐次坐标进行二维图形变换。
(2)利用数组表示并完成矩阵运算。
实验内容:
将三个顶点为分别为(100, 100),(50, 180)和( 130, 160)的三角形分别进行下列图形变换:
(1)沿x轴正方向平移150。
(2)将三角形放大到原来的2.5倍、
CClientDC *pDC;
int i;
pDC = new CClientDC(this);
CPoint pt[3] = { CPoint(100,100),CPoint(50,180),CPoint(130,160) };
pDC->Polygon(pt, 3);
i = 150;
CPoint pt2[3] = { CPoint(100+i,100),CPoint(50+i,180),CPoint(130+i,160) };
pDC->Polygon(pt2, 3);
CPoint pt3[3] = { CPoint(2.5*100,2.5*100),CPoint(2.5*50,2.5*180),CPoint(2.5*130,2.5*160) };
pDC->Polygon(pt3, 3);
delete pDC;
void transform(double M[][3], double oldX, double oldY, double *newX, double *newY)
{
*newX = 0;
*newY = 0;
*newX += oldX*M[0][0] + oldY*M[1][0] + M[2][0];
*newY += oldX*M[0][1] + oldY*M[1][1] + M[2][1];
}
void transform(double M[][3], double oldX, double oldY, double *newX, double *newY);
CClientDC *pDC;
double newx1, newy1, newx2, newy2, newx3, newy3;
double x1 = 100, y1 = 100, x2 = 50, y2 = 180, x3 = 130, y3 = 160;
double M[3][3] = { { 1, 0, 150 }, { 0, 1, 0 }, { 0, 0, 1 } };
double M1[3][3] = { { 2.5, 0, 0 }, { 0, 2.5, 0 }, { 0, 0, 1 } };
double newX, newY;
pDC = new CClientDC(this);
CPoint pt[3] = { CPoint(100, 100), CPoint(50, 180), CPoint(130, 160) };
pDC->Polygon(pt, 3);
transform(M, x1, y1, &newX, &newY);
newx1 = (int)newX;
newy1 = (int)newY;
transform(M, x2, y2, &newX, &newY);
newx2 = (int)newX;
newy2 = (int)newY;
transform(M, x3, y3, &newX, &newY);
newx3 = (int)newX;
newy3 = (int)newY;
CPoint pt2[3] = { CPoint(newx1, newy2), CPoint(newx2, newy2), CPoint(newx3, newy3) };
pDC->Polygon(pt2, 3);
transform(M1, x1, y1, &newX, &newY);
newx1 = (int)newX;
newy1 = (int)newY;
transform(M1, x2, y2, &newX, &newY);
newx2 = (int)newX;
newy2 = (int)newY;
transform(M1, x3, y3, &newX, &newY);
newx3 = (int)newX;
newy3 = (int)newY;
CPoint pt3[3] = { CPoint(newx1, newy2), CPoint(newx2, newy2), CPoint(newx3, newy3) };
pDC->Polygon(pt3, 3);
delete pDC;
void transform(double M[][3], double oldst[], double newst[],double &x,double &y)
{
newst[0] = 0;
newst[1] = 0;
newst[0] += (oldst[0]*M[0][0] + oldst[1]*M[1][0] + M[2][0]);
newst[1] += (oldst[0] * M[0][1] + oldst[1] * M[1][1] + M[2][1]);
x = newst[0];
y = newst[1];
}
void transform(double M[][3], double oldst[], double newst[], double &x, double &y);
CClientDC *pDC;
double newst[3] = { 0 };
double x=0, y=0;
double xc = 0, yc = 0;
double M[3][3] = { { 1, 0, 0 }, { 0, 1, 0 }, { 150, 0, 1 } };
pDC = new CClientDC(this);
CPoint pt[3] = { CPoint(100, 100), CPoint(50, 180), CPoint(130, 160) };
pDC->Polygon(pt, 3);
double str1[3] = { 100, 100, 1 };
transform(M,str1,newst,x,y);
xc = x;
yc = y;
pDC->MoveTo(x, y);
double str2[3] = { 50, 180, 1 };
transform(M, str2, newst, x, y);
pDC->LineTo(x, y);
double str3[3] = { 130, 160, 1 };
transform(M, str3, newst, x, y);
pDC->LineTo(x, y);
pDC->LineTo(xc, yc);
M[0][0] = 2.5;
M[1][1] = 2.5;
M[2][0] = 0;
transform(M, str1, newst, x, y);
xc = x;
yc = y;
pDC->MoveTo(x, y);
transform(M, str2, newst, x, y);
pDC->LineTo(x, y);
transform(M, str3, newst, x, y);
pDC->LineTo(x, y);
pDC->LineTo(xc, yc);
delete pDC;