计算机图形学几何图形变换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();
 
}




  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值