计算机图形学-4.2任意直线的对称变换
程序员文章站
2022-07-14 10:13:15
...
(1)算法设计原理
(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)运行结果截屏(对数据输入的说明)在这里插入代码片
完整代码:
#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();
}
}
}
}
}