计算机图形学图形的变换

/**
*作者:
*
*功能:实现简单图形的二维几何变换(平移、旋转、缩放、对称、错切变换)
*
*实验时间:2011年12月16日
*
*指导老师:杜吉祥
**/
#include<GL/glut.h>
#include<math.h>
#include<iostream>
using namespace std;

//利用OpenGL库函数画出多边形
void drawGraphic(float *p,int n) //参数意义:第一个参数是一个指针,传递顶点数组;第二个参数为顶点数
{
glBegin(GL_LINE_LOOP);
glColor3f(1.0,0.0,0.0);      //设定图形画线颜色
for(int i=0;i<n;i+=2){
glVertex2f(p[i],p[i+1]);
}
glEnd();
glFlush();
}

//矩阵乘法
//参数意义:第一个参数是指针型,传递多边形顶点数组,第二个参数为多边形顶点数,
// 第三个为一个二维数组,传递多边形的变换矩阵
void matrixMul(float *p,int n,float matrix[3][3])
{
for(int i=0;i<n;i+=2){
p[i]=p[i]*matrix[0][0]+p[i+1]*matrix[1][0]+matrix[2][0];
p[i+1]=p[i]*matrix[0][1]+p[i+1]*matrix[1][1]+matrix[2][1];
}
}

// 多边形错切操作
void graphicShear(float *p,int num)
{
//多边形错切矩阵 X方向错切量为X ,y方向错切量为Y
/*
1 Y    0
X 1    0
60 0    1 //错切后x方向平移60
*/
float X=0.3,Y=0.3;
float matrix[3][3]={{1,Y,0},{X,1,0},{60,0,1}};

// 矩阵乘法
matrixMul(p,num,matrix);

// 画出错切后的图形
drawGraphic(p,num);
}

//平移
void graphicMove(float *p,int num)
{
//x方向平移X  ,y方向上平移Y  
/*
1   0    0
0   1    0
X   Y    1
*/
float X=200,Y=100;
float matrix[3][3]={{1,0,0},{0,1,0},{X,Y,1}};

// 矩阵乘法
matrixMul(p,num,matrix);

// 画出平移后的图形
drawGraphic(p,num);
}

//图形旋转
void graphicRoll(float *p,int num)
{
int x=p[0];
int y=p[1];
//首先将多边形的一个顶点平移到原点
/*
1   0   0
0   1   0
-x  -y  1
*/
float matrix[3][3]={{1,0,0},{0,1,0},{-x,-y,1}};

// 矩阵乘法
matrixMul(p,num,matrix);

//将多边形旋转,旋转角度为A
/*
cos   sin 0
-sin  cos 0
0     0   1
*/
float  A=0.3;
float matrix2[3][3]={{cos(A),sin(A),0},{-sin(A),cos(A),0},{0,0,1}};

// 执行矩阵乘法进行选装
matrixMul(p,num,matrix2);
//将多边形平移到原来位置
/*
1   0   0
0   1   0
x   y  1
*/
float matrix3[3][3]={{1,0,0},{0,1,0},{x,y,1}};

// 运行矩阵乘法实现平移
matrixMul(p,num,matrix3);

// 画出旋转之后的图形
drawGraphic(p,num);
}

//图形缩放
void graphicScal(float *p,int num)
{
int x=p[0];
int y=p[1];
//首先将多边形的一个顶点平移到原点
/*
1   0   0
0   1   0
-x  -y  1
*/
float matrix[3][3]={{1,0,0},{0,1,0},{-x,-y,1}};

// 矩阵乘法
matrixMul(p,num,matrix);

//将多边形进行缩放,x方向缩放到原来的X倍,y方向缩放到原来的Y倍
/*
X    0    0
0    Y    0
0    0    1
*/
float  X=2,Y=2;
float matrix2[3][3]={{X,0,0},{0,Y,0},{0,0,1}};

// 执行矩阵乘法进行选装
matrixMul(p,num,matrix2);
//将多边形平移到原来位置
/*
1   0   0
0   1   0
x   y  1
*/
float matrix3[3][3]={{1,0,0},{0,1,0},{x,y,1}};

// 运行矩阵乘法实现平移
matrixMul(p,num,matrix3);

// 画出旋转之后的图形
drawGraphic(p,num);

}

//显示回调函数
void OnDisplay()
{
//消除颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);

//初始化多边形顶点
float points[]={30,30,30,120,200,120,200,30};
// 画出原图
drawGraphic(points,8);
// 对原图做平移
graphicMove(points,8);
// 对平移后的图做错切
graphicShear(points,8);
// 做错切后的图旋转
graphicRoll(points,8);
//对旋转后图形进行缩放
graphicScal(points,8);
}

void OnReshape(int w,int h)
{
glClearColor(1.0f,1.0f,1.0f,0.0f);      //设置背景颜色
gluOrtho2D(0,w,0,h); //将当前绘图区域设置为二维正交投影的
}

int main(int argc, char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowSize(800,600);
glutInitWindowPosition(100,100);
glutCreateWindow("My OpenGL");
glutDisplayFunc(&OnDisplay);
glutReshapeFunc(&OnReshape);

glutMainLoop();
return 0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值