1. 程式人生 > >計算機圖形學幾何圖形變換VS2010實現

計算機圖形學幾何圖形變換VS2010實現

矩陣實現三角形平移、旋轉30度、放大等

C++ 程式碼

// An highlighted block
// 實驗2.cpp: 
//dda
#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){ //pingyi 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; // double start[4][4]; // for(int i=0;i<4;i++) // for(int j=0;j<4;j++) // start[i][j]=xyxy[i][j]; //畫三角形 dda_line(x1,y1,x2,y2,color); dda_line(x2,y2,x3,y3,color); dda_line(x3,y3,x1,y1,color); //x1,y1,x2,y2,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); //畫旋轉三角形 旋轉A度角 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(); }