#include <graphics.h> // 引用这个图形库
#include <conio.h>
#include <math.h>
//变换矩阵
struct Matrix {
double a[10][10];
Matrix() {
memset(a, 0, sizeof(a));
}
void init() {
for (int i = 0; i <= 4; i++) {
a[i][i] = 1;
}
}
};
//坐标点
struct Point
{
double x, y;
};
//矩阵相乘
Matrix get_mx(Matrix a, Matrix b) {
Matrix tmp;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
double sum = 0;
for (int k = 0; k < 3; k++) {
sum += a.a[i][k] * b.a[k][j];
}
tmp.a[i][j] = sum;
}
}
return tmp;
}
//得到与矩阵相乘后的点
Point matrix_point(Point p, Matrix m) {
Matrix n;
n.a[0][0] = p.x;
n.a[1][0] = p.y;
n.a[2][0] = 1;
for (int i = 0; i < 3; i++) {
double sum = 0;
for (int j = 0; j < 3; j++) {
sum += m.a[i][j] * n.a[j][0];
}
n.a[i][1] = sum;
}
p.x = n.a[0][1] / n.a[2][1];
p.y = n.a[1][1] / n.a[2][1];
return p;
}
//平移
Matrix translate(double Tx, double Ty, Matrix m) {
Matrix tmp;
tmp.init();
tmp.a[0][2] = Tx;
tmp.a[1][2] = Ty;
tmp = get_mx(m, tmp);
return tmp;
}
//放缩
Matrix Shrink(double Tx, double Ty, Matrix m) {
Matrix tmp;
tmp.init();
tmp.a[0][0] = Tx;
tmp.a[1][1] = Ty;
tmp = get_mx(m, tmp);
return tmp;
}
//旋转
Matrix revolve(double cot, Matrix m) {
Matrix tmp;
tmp.init();
tmp.a[0][0] = cos(cot);
tmp.a[1][1] = cos(cot);
tmp.a[0][1] = -(sin(cot));
tmp.a[1][0] = sin(cot);
tmp = get_mx(m, tmp);
return tmp;
}
//轴对称
Matrix axisymmetric(int x, Matrix m) {
Matrix tmp;
tmp.init();
//x==1为x轴对称
if (x == 1) {
tmp.a[1][1] = -1;
}
//否则为y轴对称
else {
tmp.a[0][0] = -1;
}
tmp = get_mx(m, tmp);
return tmp;
}
//关于任意轴对称
Matrix symmetry(double k, double b, Matrix m) {
Matrix tmp;
tmp.init();
//先平移
double cot = atan(k);
tmp = translate(0, -b, tmp);
//再旋转
tmp = revolve(cot, tmp);
//再沿x轴对称
tmp = axisymmetric(1, tmp);
//再旋转
tmp = revolve(-cot, tmp);
//再平移
tmp = translate(0, b, tmp);
tmp = get_mx(m, tmp);
return tmp;
}
// 主函数
void main()
{
//新建一个640*480的画布
initgraph(640, 480);
//设置坐标原点为像素点320*240处
setorigin(320, 240);
//绘制原始三角形
Point p1 = { 10,10 };
Point p2 = { -90,40 };
Point p3 = { -20,50 };
POINT pts[] = { {p1.x,p1.y}, {p2.x,p2.y}, {p3.x,p3.y} };
fillpolygon(pts, 3);
//平移操作,图形用蓝色填充
Matrix m1;
m1.init();
m1=translate(30, 30, m1);//调用平移函数
p1 = matrix_point(p1, m1);
p2 = matrix_point(p2, m1);
p3 = matrix_point(p3, m1);
//绘制平移后三角形
POINT ptsPY[] = { {p1.x,p1.y}, {p2.x,p2.y}, {p3.x,p3.y} };
setfillcolor(BLUE);
fillpolygon(ptsPY, 3);
/*以下绘制第二个原始三角形*/
Point p4 = { 100,100};
Point p5 = { 50,50};
Point p6 = { 50,150};
POINT pts2[] = { {p4.x,p4.y}, {p5.x,p5.y}, {p6.x,p6.y} };
setfillcolor(WHITE);
fillpolygon(pts2, 3);
//旋转操作,旋转45度,使用红色填充
Matrix m2;
m2.init();
m2 = revolve(45, m2);//调用旋转函数
p4 = matrix_point(p4, m2);
p5 = matrix_point(p5, m2);
p6 = matrix_point(p6, m2);
//绘制旋转后三角形
POINT ptsXZ[] = { {p4.x,p4.y}, {p5.x,p5.y}, {p6.x,p6.y} };
setfillcolor(RED);
fillpolygon(ptsXZ, 3);
绘制沿任意轴对称,使用绿色填充
Matrix m4;
m4.init();
m4 = symmetry(1, 0, m4);
p1 = matrix_point(p1, m4);
p2 = matrix_point(p2, m4);
p3 = matrix_point(p3, m4);
//绘制对称后三角形
POINT ptsDC[] = { {p1.x,p1.y}, {p2.x,p2.y}, {p3.x,p3.y} };
setfillcolor(GREEN);
fillpolygon(ptsDC, 3);
_getch();
closegraph();
}
更多推荐
矩阵在图形变换中的应用(EasyX)
发布评论