欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算机图形学-4.2任意直线的对称变换

程序员文章站 2022-07-14 10:13:15
...

(1)算法设计原理
计算机图形学-4.2任意直线的对称变换(2)程序关键代码

//对于直线Ax+By+C=0对称变换的变换矩阵
Matrix zhixMatrix(double A,double B,double C)
{
	Matrix result;
	result=InitMatrix(3,3);
	double X=A*A+B*B;
	result.matrix[0][0]=-2*A*A/X+1;
	result.matrix[0][1]=-2*A*B/X;
	result.matrix[0][2]=0;
	result.matrix[1][0]=-2*A*B/X;
	result.matrix[1][1]=-2*B*B/X+1;
	result.matrix[1][2]=0;
	result.matrix[2][0]=-2*A*C/X;
	result.matrix[2][1]=-2*B*C/X;
	result.matrix[2][2]=1;
	return result;
}

void zhix(Matrix m,double A,double B,double C)
{
	Matrix m1;
	m1=zhixMatrix(A,B,C);
	m=Mul(m,m1);
	drawmatrix(m);
}

(3)运行结果截屏(对数据输入的说明)
在这里插入代码片计算机图形学-4.2任意直线的对称变换
完整代码:

#include<stdio.h>
#include<graphics.h>
#include<math.h>
#include<conio.h>
#include<iostream>
#include<malloc.h>
using namespace std;

#define PI 3.14159265

typedef struct
{
	int row,col;
	float **matrix;
}Matrix;


Matrix CreateMatrix()
{
	int i=0;
	Matrix m;
	int row=9;
	int col=3;
	float **enterMatrix;
	enterMatrix=(float**)malloc(row*sizeof(float*));
	for(i=0;i<row;i++)
		enterMatrix[i]=(float*)malloc(col*sizeof(float));
	enterMatrix[0][0]=-160;
	enterMatrix[0][1]=120;

	enterMatrix[1][0]=-170;
	enterMatrix[1][1]=130;
	enterMatrix[2][0]=-170;
	enterMatrix[2][1]=110;

	enterMatrix[3][0]=-150;
	enterMatrix[3][1]=130;
	enterMatrix[4][0]=-150;
	enterMatrix[4][1]=110;

	enterMatrix[5][0]=-160;
	enterMatrix[5][1]=150;

	enterMatrix[6][0]=-160;
	enterMatrix[6][1]=90;

	enterMatrix[7][0]=-190;
	enterMatrix[7][1]=120;
	enterMatrix[8][0]=-130;
	enterMatrix[8][1]=120;
	for(i=0;i<9;i++)
	{
		enterMatrix[i][2]=1;
	}
	m.col=col;
	m.row=row;
	m.matrix=enterMatrix;
	return m;
}

//初始化一个行为row列为col的矩阵
Matrix InitMatrix(int row,int col)
{
	int i=0;
	Matrix m;
	float **matrix;
	matrix=(float**)malloc(row*sizeof(float*));
	for(i=0;i<row;i++)
		matrix[i]=(float*)malloc(col*sizeof(col*sizeof(float)));
	for(i=0;i<row;i++)
	{
		for(int j=0;j<col;j++)
		{
			matrix[i][j]=0;
		}
	}
	m.col=col;
	m.row=row;
	m.matrix=matrix;
	return m;
}

//矩阵加法
Matrix add(Matrix m1,Matrix m2)
{
	int i=0;
	for(i=0;i<m1.row;i++)
	{
		for(int j=0;j<m1.col;j++)
		{
			m1.matrix[i][j]=m1.matrix[i][j]+m2.matrix[i][j];
		}
	}
	return m1;
}

//矩阵减法
Matrix jian(Matrix m1,Matrix m2)
{
	int i=0;
	for(i=0;i<m1.row;i++)
	{
		for(int j=0;j<m1.col;j++)
		{
			m1.matrix[i][j]=m1.matrix[i][j]-m2.matrix[i][j];
		}
	}
	return m1;
}

//row为M1的行,col为M2的列
int calRowCol(Matrix M1,Matrix M2,int row,int col)
{
	int result=0;
	int same=M1.col;
	for(int j=0;j<same;j++)
	{
		result+=M1.matrix[row][j]*M2.matrix[j][col];
	}
	return result;
}

//矩阵乘法
Matrix Mul(Matrix m1,Matrix m2)
{
	Matrix result=InitMatrix(m1.row,m2.col);
	for(int i=0;i<m1.row;i++)
	{
		for(int j=0;j<m2.col;j++)
		{
			result.matrix[i][j]=calRowCol(m1,m2,i,j);
		}
	}
	return result;
}

//视窗变化
Matrix sc(Matrix m)
{
	Matrix result;
	result=InitMatrix(m.row,m.col);
	for(int i=0;i<m.row;i++)
	{
		result.matrix[i][0]=m.matrix[i][0]+320;
		result.matrix[i][1]=240-m.matrix[i][1];
	}
	return result;
}

Matrix dymatrix(Matrix m)
{
	int i,j;
	Matrix result;
	result=InitMatrix(m.row,m.col);
	for(i=0;i<m.row;i++)
	{
		for(j=0;j<m.col;j++)
		{
			result.matrix[i][j]=m.matrix[i][j];
		}
	}
	return result;
}

//画
void drawmatrix(Matrix m1)
{
	Matrix m;
	m=dymatrix(m1);
	m=sc(m);
	POINT pts2[4];
		pts2[0].x=int(m.matrix[0][0]);
	pts2[0].y=int(m.matrix[0][1]);
		pts2[1].x=int(m.matrix[2][0]);
	pts2[1].y=int(m.matrix[2][1]);
		pts2[2].x=int(m.matrix[6][0]);
	pts2[2].y=int(m.matrix[6][1]);
		pts2[3].x=int(m.matrix[4][0]);
	pts2[3].y=int(m.matrix[4][1]);
	setpolyfillmode(WINDING);
	// 设置填充颜色为蓝色
	setfillcolor(BLUE);
	// 绘制
	solidpolygon(pts2, 4);

	POINT pts1[4];
	int j=0;
	int i=0;
	for(i=0;i<4;i++)
	pts1[0].x=int(m.matrix[0][0]);
	pts1[0].y=int(m.matrix[0][1]);
		pts1[1].x=int(m.matrix[1][0]);
	pts1[1].y=int(m.matrix[1][1]);
		pts1[2].x=int(m.matrix[5][0]);
	pts1[2].y=int(m.matrix[5][1]);
		pts1[3].x=int(m.matrix[3][0]);
	pts1[3].y=int(m.matrix[3][1]);

	setpolyfillmode(WINDING);
	// 设置填充颜色为红色
	setfillcolor(RED);
	// 绘制
	solidpolygon(pts1, 4);

	POINT pts3[4];
	pts3[0].x=int(m.matrix[0][0]);
	pts3[0].y=int(m.matrix[0][1]);
		pts3[1].x=int(m.matrix[3][0]);
	pts3[1].y=int(m.matrix[3][1]);
		pts3[2].x=int(m.matrix[8][0]);
	pts3[2].y=int(m.matrix[8][1]);
		pts3[3].x=int(m.matrix[4][0]);
	pts3[3].y=int(m.matrix[4][1]);
	setpolyfillmode(WINDING);
	// 设置填充颜色为绿色
	setfillcolor(GREEN);
	// 绘制
	solidpolygon(pts3, 4);

	POINT pts4[4];

		pts4[0].x=int(m.matrix[0][0]);
	pts4[0].y=int(m.matrix[0][1]);
		pts4[1].x=int(m.matrix[1][0]);
	pts4[1].y=int(m.matrix[1][1]);
		pts4[2].x=int(m.matrix[7][0]);
	pts4[2].y=int(m.matrix[7][1]);
		pts4[3].x=int(m.matrix[2][0]);
	pts4[3].y=int(m.matrix[2][1]);
	setpolyfillmode(WINDING);
	// 设置填充颜色为红色
	setfillcolor(MAGENTA);
	// 绘制
	solidpolygon(pts4, 4);
}


//对于直线Ax+By+C=0对称变换的变换矩阵
Matrix zhixMatrix(double A,double B,double C)
{
	Matrix result;
	result=InitMatrix(3,3);
	double X=A*A+B*B;
	result.matrix[0][0]=-2*A*A/X+1;
	result.matrix[0][1]=-2*A*B/X;
	result.matrix[0][2]=0;
	result.matrix[1][0]=-2*A*B/X;
	result.matrix[1][1]=-2*B*B/X+1;
	result.matrix[1][2]=0;
	result.matrix[2][0]=-2*A*C/X;
	result.matrix[2][1]=-2*B*C/X;
	result.matrix[2][2]=1;
	return result;
}

void zhix(Matrix m,double A,double B,double C)
{
	Matrix m1;
	m1=zhixMatrix(A,B,C);
	m=Mul(m,m1);
	drawmatrix(m);
}



void main()
{
	initgraph(640,480);
	Matrix m1;
	m1=CreateMatrix();
	line(480,100,160,340);
	Matrix m2;
	m2=CreateMatrix();
	drawmatrix(m1);
	
	MOUSEMSG m;	
	while(true)
	{
		m = GetMouseMsg();
		if(m.uMsg == WM_LBUTTONDOWN)
		{
			zhix(m1,2.00,-3.00,60.00);

			while(true)
			{
				m = GetMouseMsg();
				if(m.uMsg == WM_LBUTTONDOWN)
				{
					line(560,0,80,0);
		
					_getch();
					closegraph();
				}
			}
		}
	}
}

相关标签: 计算机图形学