程序运行结果如下图:

 #include <GL/glut.h>

 #include <stdlib.h>

 #include <math.h>

 /* 初始化显示窗口大小 */

 GLsizei winWidth=,winHeight=;

 /* 设置世界坐标系的显示范围 */

 GLfloat xwcMin=-300.0,xwcMax=300.0;

 GLfloat ywcMin=-300.0,ywcMax=300.0;

 void init (void)

 {

 /* 设置显示窗口的背景颜色为白色 */

 glClearColor(1.0,1.0,1.0,0.0);

 }

 class wcPt3D

 {

 public:

 GLfloat x, y, z;

 };

 /* 三维旋转变换,参数:旋转轴(由点p1和p2定义)和旋转角度(thetaDegrees)*/

 void rotate3D (wcPt3D p1, wcPt3D p2, GLfloat thetaDegrees)

 {

 /* 设置旋转轴的矢量 */

 float vx = (p2.x - p1.x);

 float vy = (p2.y - p1.y);

 float vz = (p2.z - p1.z);

 /*通过平移-旋转-平移复合变换序列完成任意轴的旋转(注意OpenGL中的反序表示)*/

 glTranslatef (p1.x, p1.y, p1.z); //③移动p1到原始位置

 /*②关于通过坐标原点的坐标轴旋转*/

 glRotatef (thetaDegrees, vx, vy, vz);

 glTranslatef (-p1.x, -p1.y, -p1.z); //①移动p1到原点位置

 }

 /* 三维比例放缩变换,参数:比例系数sx、sy、sz和固定点fixedPt */

 void scale3D (GLfloat sx, GLfloat sy, GLfloat sz, wcPt3D fixedPt)

 {

 /*通过平移-放缩-平移复合变换序列完成任意点为中心点的比例缩放*/

 /* ③反平移到原始位置*/

 glTranslatef (fixedPt.x, fixedPt.y, fixedPt.z);

 glScalef (sx, sy, sz); // ②基于原点的比例放缩变换

 /* ① 移动固定点到坐标原点*/

 glTranslatef (-fixedPt.x, -fixedPt.y, -fixedPt.z);

 }

 void displayFcn (void)

 {

 /* 设置变换中心点位置 */

 wcPt3D centroidPt,R_p1, R_p2;

 centroidPt.x=;

 centroidPt.y=;

 centroidPt.z=;

 R_p1=centroidPt;

 R_p2.x=;

 R_p2.y=;

 R_p2.z=;

 /* 设置几何变换参数*/

 wcPt3D p1,p2,fixedPt;

 p1= R_p1;

 p2= R_p2;

 fixedPt=centroidPt;

 GLfloat tx=0.0,ty=100.0,tz=;

 GLfloat sx=0.5,sy=0.5,sz=;

 GLdouble thetaDegrees = ;

 glClear(GL_COLOR_BUFFER_BIT); // 清空显示窗口

 glMatrixMode (GL_MODELVIEW);

 glLoadIdentity(); //清空变换矩阵为单位矩阵,恢复原始坐标系环境

 /* 显示变换前几何对象 */

 glColor3f(0.0,0.0,1.0); // 设置前景色为蓝色

 glRecti(,,,); //显示蓝色矩形(变换前)

 /* 执行几何变换(注意以反序形式写出)*/

 glTranslatef (tx, ty, tz); // ③平移变换

 scale3D (sx, sy, sz, fixedPt); // ②比例放缩变换

 rotate3D (p1, p2, thetaDegrees); // ①旋转变换

 /* 显示变换后几何对象 */

 glColor3f(1.0,0.0,0.0); //重新设置前景色为红色

 glRecti(,,,); //显示红色矩形(变换后)

 glFlush();

 }

 void winReshapeFcn(GLint newWidth,GLint newHeight)

 {

 glMatrixMode(GL_PROJECTION);

 glLoadIdentity();

 gluOrtho2D(xwcMin,xwcMax,ywcMin,ywcMax);

 glClear(GL_COLOR_BUFFER_BIT);

 }

 void main(int argc, char ** argv)

 {

 glutInit(&argc,argv);

 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

 glutInitWindowPosition(,);

 glutInitWindowSize(winWidth,winHeight);

 glutCreateWindow("三维几何变换实例-OpenGL版复合变换");

 init();

 glutDisplayFunc(displayFcn);

 glutReshapeFunc(winReshapeFcn);

 glutMainLoop();

 }

附上本实验的VC++工程代码(VC++2008)

4.4.2 OpenGL几何变换编程实例的更多相关文章

  1. PHP多进程编程实例

    这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...

  2. c#摄像头编程实例 (转)

    c#摄像头编程实例 摄像头编程 安装摄像头后,一般可以找到一个avicap32.dll文件 这是一个关于设想头的类 using  system;using  System.Runtime.Intero ...

  3. JAX-RS 2.0 REST客户端编程实例

    JAX-RS 2.0 REST客户端编程实例 2014/01/28 | 分类: 基础技术, 教程 | 0 条评论 | 标签: JAX-RS, RESTFUL 分享到:3 本文由 ImportNew - ...

  4. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  5. hadoop2.2编程:使用MapReduce编程实例(转)

    原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 从网上搜到的一篇hadoop的编程实例,对于初学者真是帮助太大 ...

  6. python学习_数据处理编程实例(二)

    在上一节python学习_数据处理编程实例(二)的基础上数据发生了变化,文件中除了学生的成绩外,新增了学生姓名和出生年月的信息,因此将要成变成:分别根据姓名输出每个学生的无重复的前三个最好成绩和出生年 ...

  7. 请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别

      请求转发:MVC设计模式.细节.请求域属性的编程实例.请求重定向和请求转发的区别 MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层) ...

  8. Python进阶:函数式编程实例(附代码)

    Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...

  9. The MySQL C API 编程实例

    在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...

随机推荐

  1. 13、Next Item Recommendation with Self-Attention---自注意力+CML

    一.摘要: 自注意力机制------从用户历史交互中推断出项目-项目关系.学习每个项目的相对权重[用来学习用户的暂时兴趣表示] 二. 模型: 一部分是用于建模用户短期意图的自注意力机制,一部分是建模用 ...

  2. HDU 2268 How To Use The Car (数学题)

    题目 //做起来很艰辛,总结起来很简单... //注意步行速度可能比车的速度快.... //推公式要仔细,,,, //一道对我来说很搞脑子的数学题,,,,, //车先送第一个人上路,第二个人步行:中途 ...

  3. vue,基础整理,夯实基础,为进阶打基础

    把基础部分,再次系统的了解一遍,整理成文档.

  4. 51nod1081 子段求和

    给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和. 例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1.3 + 7 + 9 = ...

  5. [jzoj5791]【NOIP2008模拟】阶乘 (数学)

    传送门 Description 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. Input 共两行. 第一行一个正整数n. 第二行n个正 ...

  6. Centos 7, Torque 单节点部署

    1.准备工作 安装Torque必须首先配置linux主机名称,服务器主机名称大多默认localhost,不建议直接使用localhost. linux主机名称修改地址:http://www.cnblo ...

  7. ldap 基本名词解释(3)

    名词解释 Objectclass LDAP对象类,是LDAP内置的数据模型.每种objectClass有自己的数据结构,比如我们有一种叫“电话薄”的objectClass,肯定会内置很多属性(attr ...

  8. 10.IDEAD 的xml中配置DTD

    此时发现最后一行已经变成绿色就说明可以了,有提示了

  9. 2018ICPC南京

    可能上一次秦皇岛拿了银,有了偶像包袱? 打的时候感觉状态不是很好. 第一题,让你每次将连续一段区间的石头都拿掉.. 然后让你做个博弈. 橘子一顿分析,认为k+1的倍数都是输. 这时,我们以及默认i+1 ...

  10. 怎么样调整FreeBSD时区问题

    一般我们在安装系统的时候,都会遇到服务器时间不同步的情况.所以必须得设置为中国时区,比较简单的方法,就总结如下几点: 1.通过命令行启动图形界面更改 #sysinstall 请选择 configure ...