#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)