矩阵实现三角形平移、旋转30度、放大等
C++ 代码
#include "stdafx.h"
#include "graphics.h"
#include <conio.h>
#include "windows.h"
#include <math.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
void dda_line(double xa, double ya, double xb, double yb, int c)
{
double delta_x, delta_y, x, y;
double dx, dy;
int steps, k;
dx=xb-xa;
dy=yb-ya;
if(abs(dx)>abs(dy))steps=abs(dx);
else steps=abs(dy);
delta_x=(double)dx/(double)steps;
delta_y=(double)dy/(double)steps;
x=xa;
y=ya;
putpixel(x, y, c);
for(k=1;k<=steps;k++)
{
x+=delta_x;
y+=delta_y;
putpixel(x, y, c);
}
}
void aa(double xyxy[][4],double a2[][4],double value[][4]){
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
value[i][j]=0;
for(int k=1;k<=3;k++)
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
value[k][i]=xyxy[k][j]*a2[j][i]+value[k][i];
}
void get_value(double xyxy[][4],double value[][4],double xn,double yn,double A,double bx,double by,int type ){
double a[4][4]={0};
double b[4][4]={0};
double c[4][4]={0};
if(type==1){
a[1][1]=1; a[2][2]=1; a[3][3]=1;
a[3][1]=xn,a[3][2]=yn;
aa(xyxy,a,value);
}
else if(type==2){
double pi=3.1415926;
b[3][3]=1;
double cs=cos(A*pi/180);
double si=sin(A*pi/180);
b[1][1]=cs; b[1][2]=si;
b[2][1]=-si; b[2][2]=cs;
aa(xyxy,b,value);
}
else if(type==3){
c[3][3]=1;
c[1][1]=bx;
c[2][2]=by;
aa(xyxy,c,value);
}
else if(type==4){
c[3][3]=1;
c[1][1]=1/bx;
c[2][2]=1/by;
aa(xyxy,c,value);
}
}
void main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"");
double X1,X2,X3,Y1,Y2,Y3;
double value[4][4]={0};
double x1=66,y1=66;
double x2=99,y2=99;
double x3=233,y3=88;
double xn=200,yn=200;
int color=RED;
double A=30;
double bx=2;
double by=2;
double xyxy[4][4];
xyxy[1][1]=x1; xyxy[1][2]=y1; xyxy[1][3]=1;
xyxy[2][1]=x2; xyxy[2][2]=y2; xyxy[2][3]=1;
xyxy[3][1]=x3; xyxy[3][2]=y3; xyxy[3][3]=1;
dda_line(x1,y1,x2,y2,color);
dda_line(x2,y2,x3,y3,color);
dda_line(x3,y3,x1,y1,color);
getchar();
get_value(xyxy,value,xn,yn,A,bx,by,1);
dda_line(value[1][1],value[1][2],value[2][1],value[2][2],color);
dda_line(value[2][1],value[2][2],value[3][1],value[3][2],color);
dda_line(value[3][1],value[3][2],value[1][1],value[1][2],color);
getchar();
get_value(xyxy,value,xn,yn,A,bx,by,2);
dda_line(value[1][1],value[1][2],value[2][1],value[2][2],color);
dda_line(value[2][1],value[2][2],value[3][1],value[3][2],color);
dda_line(value[3][1],value[3][2],value[1][1],value[1][2],color);
getchar();
get_value(xyxy,value,xn,yn,A,bx,by,3);
dda_line(value[1][1],value[1][2],value[2][1],value[2][2],color);
dda_line(value[2][1],value[2][2],value[3][1],value[3][2],color);
dda_line(value[3][1],value[3][2],value[1][1],value[1][2],color);
get_value(xyxy,value,xn,yn,A,bx,by,4);
dda_line(value[1][1],value[1][2],value[2][1],value[2][2],color);
dda_line(value[2][1],value[2][2],value[3][1],value[3][2],color);
dda_line(value[3][1],value[3][2],value[1][1],value[1][2],color);
double x[10],y[10];
x[1]=x1+xn,y[1]=y1+yn;
x[2]=x2+xn,y[2]=y2+yn;
x[3]=x3+xn,y[3]=y3+yn;
int a=1,b=1;
double xMax=x[1];
double xMin=x[1];
if(x[2]>xMax){ xMax=x[2]; a=2;}
else if(x[3]>xMax){ xMax=x[3]; a=3;}
if(x[2]<xMin){ xMin=x[2]; b=2;}
else if(x[3]<xMin){ xMin=x[3]; b=3;}
int X=(xMax+xMin)/2;
for(int i=1;i<=3;i++){
if(x[i]>X){x[i]=x[i]-2* abs(x[i]-X);}
else if(x[i]<X){x[i]=x[i]+2* abs(x[i]-X);}
}
getchar();
dda_line(x[1],y[1],x[2],y[2],color);
dda_line(x[2],y[2],x[3],y[3],color);
dda_line(x[3],y[3],x[1],y[1],color);
getchar();
dda_line(x1,y1,x2,y2,0);
dda_line(x2,y2,x3,y3,0);
dda_line(x3,y3,x1,y1,0);
getch();
closegraph();
}