前言
提示:主要说明变换方法
本文主要来说明几何变换中的二维变换,代码主要侧重于平移,后续如果有时间的话会陆续发出来
一、二维变换的形式
- 二维变换主要有平移、比例变换、旋转、反射、错切这几种形式。接下来解释一下这几种形式的变换方法都具体是指什么
- 平移:主要是沿某个方向进行平移,沿x轴,y轴或某一条直线
- 比例变换:也就是放缩,可以将x方向缩放几倍,y方向也可以缩放,当缩放比例相同并大于1则为等比例放大,若小于1则为等比例缩小
- 旋转:主要是相对于原点进行旋转,根据旋转角度进行旋转,当参考点偏移,则必须将参考点平移到原点再旋转,完后平移至原位置
- 反射:也就是得到相反的图形,可以关于原点、x轴和y轴进行反射,关于原点反射则x,y坐标均为-x,-y,若为x轴反射则y=-y,同理y坐标也一样
- 错切:通俗点说就像一个平行四边形,拉动一条对边的顶点,这个过程就是错切,如果沿y轴错切,则x坐标不变,同理x轴也一样
二、变换方法
提示:这里主要以平移举例,后续会说其它的
- 平移变换的坐标表示x’=x+Tx,y’=y+Ty,其中Tx,Ty为平移系数,也就是平移距离。
- 其次坐标矩阵表示:
根据这个矩阵表达式便可得出二维平移变换矩阵为 - 那么为什么矩阵表达式要那样写?根据线性代数中的矩阵相乘知识而来,也就是一个3行1列的矩阵是由一个3阶矩阵乘以一个3行1列的矩阵得来,由此便可推断出这个矩阵表达式,至于里面多余的1则是为了将坐标规范化。
- 得到平移的变换矩阵后,只需要替换平移系数再和坐标矩阵进行矩阵相乘便可以得到平移后的坐标
三、核心代码
此代码针对于平移
//这个是获取坐标列表和坐标个数
void E_Transform::SetMatrix(E_Point* P, int Pt)
{
this->P = P;
PtNumber = Pt;
}
//这个T是单位矩阵
void E_Transform::Identity()
{
T[0][0] = 1.0; T[0][1] = 0.0; T[0][2] = 0.0;
T[1][0] = 0.0; T[1][1] = 1.0; T[1][2] = 0.0;
T[2][0] = 0.0; T[2][1] = 0.0; T[2][2] = 1.0;
}
//这个是进行矩阵乘法
void E_Transform::MultiplyMatrix()
{
E_Point* pNew = new E_Point[PtNumber];//临时存储旧的坐标列表
for (int j = 0; j < PtNumber; j++) {
pNew[j] = P[j];
}
for (int i = 0; i < PtNumber; i++) {
P[i].x = pNew[i].x * T[0][0] + pNew[i].y * T[0][1] + pNew[i].w * T[0][2];
P[i].y = pNew[i].x * T[1][0] + pNew[i].y * T[1][1] + pNew[i].w * T[1][2];
P[i].w = pNew[i].x * T[2][0] + pNew[i].y * T[2][1] + pNew[i].w * T[2][2];
}
delete[]pNew;
}
//这个是组合之后的平移函数
//两个参数就是平移系数
void E_Transform::E_Translate(double tx, double ty)
{
Identity();
T[0][2] = tx; T[1][2] = ty;
MultiplyMatrix();
}
以下是main函数调用进行线段的平移
HWND hwnd = initgraph(500, 500);
setbkcolor(WHITE);
cleardevice();
setlinecolor(LIGHTBLUE);
setlinestyle(PS_SOLID, 2);
E_Point P[2] = {
{100,20},
{400,20}
};
E_Transform form;
for (;1;) {
int ty = 10;
moveto(P[0].x, P[0].y);
lineto(P[1].x, P[1].y);
form.SetMatrix(P, 2);
form.E_Translate(0,ty);
Sleep(1000);
cleardevice();
}
getchar();
closegraph();
return 0;