OpenGL——二维几何变换

平移、旋转、缩放的实现

#include<iostream>
#include <math.h>
#include<Windows.h>
#include <GL/glut.h>using namespace std;GLsizei winWidth = 600, winHeight = 600;GLfloat xwcMin = 0.0, xwcMax = 225.0;
GLfloat ywcMin = 0.0, ywcMax = 225.0;class wcPt2D {
public:GLfloat x, y;
};typedef GLfloat Matrix3x3[3][3];Matrix3x3 matComposite;const GLdouble pi = 3.14159;void init()
{//窗口背景为白色glClearColor(1.0, 1.0, 1.0, 0.0);
}void matrix3x3SetIdentity(Matrix3x3 matIdent3x3)
{GLint row, col;for (row = 0; row < 3; row++) {for (col = 0; col < 3; col++) {matIdent3x3[row][col] = (row == col);}}
}void matrix3x3PreMultiply(Matrix3x3 m1, Matrix3x3 m2)
{GLint row, col;Matrix3x3 matTemp;for (row = 0; row < 3; row++) {for (col = 0; col < 3; col++) {matTemp[row][col] = m1[row][0] * m2[0][col] + m1[row][1] * m2[1][col] +m1[row][2] * m2[2][col];}}for (row = 0; row < 3; row++) {for (col = 0; col < 3; col++) {m2[row][col] = matTemp[row][col];}}
}void translate2D(GLfloat tx, GLfloat ty)
{Matrix3x3 matTransl;matrix3x3SetIdentity(matTransl);matTransl[0][2] = tx;matTransl[1][2] = ty;matrix3x3PreMultiply(matTransl, matComposite);
}void rotate2D(wcPt2D pivotPt, GLfloat theta)
{Matrix3x3 matRot;matrix3x3SetIdentity(matRot);matRot[0][0] = cos(theta);matRot[0][1] = -sin(theta);matRot[0][2] = pivotPt.x * (1 - cos(theta)) + pivotPt.y * sin(theta);matRot[1][0] = sin(theta);matRot[1][1] = cos(theta);matRot[1][2] = pivotPt.y * (1 - cos(theta)) - pivotPt.x * sin(theta);matrix3x3PreMultiply(matRot, matComposite);
}void scale2D(GLfloat sx, GLfloat sy, wcPt2D fixedPt)
{Matrix3x3 matScale;matrix3x3SetIdentity(matScale);matScale[0][0] = sx;matScale[0][2] = (1 - sx) * fixedPt.x;matScale[1][1] = sy;matScale[1][2] = (1 - sy) * fixedPt.y;matrix3x3PreMultiply(matScale, matComposite);
}void transformVerts2D(GLint nVerts, wcPt2D * verts)
{GLint k;GLfloat temp;for (k = 0; k < nVerts; k++) {temp = matComposite[0][0] * verts[k].x + matComposite[0][1] * verts[k].y + matComposite[0][2];verts[k].y = matComposite[1][0] * verts[k].x + matComposite[1][1] * verts[k].y + matComposite[1][2];verts[k].x = temp;}
}void triangle(wcPt2D *verts)
{glBegin(GL_TRIANGLES);for (GLint k = 0; k < 3; k++) {glVertex2f(verts[k].x, verts[k].y);}glEnd();
}void displayFcn()
{    GLint nVerts = 3;wcPt2D verts[3] = { {50.0,25.0},{150.0,25.0},{100.0,100.0} };wcPt2D centroidPt;GLint xSum = 0, ySum = 0;for (GLint k = 0; k < nVerts; k++) {xSum += verts[k].x;ySum += verts[k].y;}centroidPt.x = GLfloat(xSum) / GLfloat(nVerts);centroidPt.y = GLfloat(ySum) / GLfloat(nVerts);wcPt2D pivPt, fixedPt;pivPt = centroidPt;fixedPt = centroidPt;GLfloat tx = 0.0, ty = 100.0;GLfloat sx = 0.5, sy = 0.5;GLdouble theta = pi / 2;glClear(GL_COLOR_BUFFER_BIT);glColor3f(200.0 / 255.0, 200.0 / 255.0, 169.0 / 255.0);triangle(verts);matrix3x3SetIdentity(matComposite);scale2D(sx, sy, fixedPt);transformVerts2D(nVerts, verts);glColor3f(137.0 / 255.0, 190.0 / 255.0, 178.0 / 255.0);triangle(verts);matrix3x3SetIdentity(matComposite);rotate2D(pivPt, theta);transformVerts2D(nVerts, verts);glColor3f(69.0 / 255.0, 137.0 / 255.0, 148.0 / 255.0);triangle(verts);matrix3x3SetIdentity(matComposite);translate2D(tx, ty);transformVerts2D(nVerts, verts);glColor3f(178.0 / 255.0, 200.0 / 255.0, 187.0 / 255.0);triangle(verts);glFlush();
}void winReshapeFcn(GLint newWidth, GLint newHeight)
{glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(xwcMin, xwcMax, ywcMin, ywcMax);glClear(GL_COLOR_BUFFER_BIT);
}int main(int argc, char* argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(50, 50);glutInitWindowSize(winWidth, winHeight);glutCreateWindow("二维几何变换");init();glutDisplayFunc(displayFcn);glutReshapeFunc(winReshapeFcn);glutMainLoop();system("pause");return 0;
}

运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Eclipse 中打开当前文件夹

原文连接&#xff1a;https://www.cnblogs.com/panie2015/p/5985053.html ------------------------------------------------------------------------ 最近试过好多次&#xff0c;安装插件来 在Eclipse 中打开当前文件所在文件夹&#xff0c;结果总是不甚如意。 烦躁了&…

服务器应用日志清理,Linux下Tomcat日志定期清理

服务器上的tomcat的catalina.out文件越来越大&#xff0c;查看起来很不方便&#xff0c;以前每次都是想起来的时候手工清理一下(cat /dev/null > catalina.out)&#xff0c;后来发现了logratate这个工具&#xff0c;Ubuntu下的mysql,nginx好像也是用的这个工具还定期整理log…

dubbo简易监控中心安装

dubbo简易监控中心也是dubbo服务应用。 为什么叫“简易”&#xff1f;这是阿里巴巴定义的&#xff0c;意思是功能不多但够用&#xff0c;可以自己扩展。 1、下载dubbo源码&#xff0c;要与使用的dubbo版本一致。 https://github.com/alibaba/dubbo/releases 2、maven instal…

前端架构设计1:代码核心

现在的前端领域, 随着JS框架, UI框架和各种库的丰富, 前端架构也变得十分的重要. 如果一个大型项目没有合理的前端架构设计, 那么前端代码可能因为不同的开发人员随意的引入各种库和UI框架, 导致代码量变得异常臃肿, 最终结果可能是代码变得无法维护, 页面性能低下,不得已只能推…

如何用法向量求点到平面距离_支持向量机(SVM)

最近完成的一个项目用到了SVM&#xff0c;之前也一直有听说支持向量机&#xff0c;知道它是机器学习中一种非常厉害的算法。利用将近一个星期的时间学习了一下支持向量机&#xff0c;把原理推了一遍&#xff0c;感觉支持向量机确实挺厉害的&#xff0c;尤其是核函数变换可以把一…

TortoiseSVN 1.9.5安装 与 Eclipse4.4.2中安装SVN插件 图解详解

原文链接&#xff1a;http://blog.csdn.net/chenchunlin526/article/details/54631458 Eclipse svn 插件官网&#xff1a;http://subclipse.tigris.org/ Eclipse svn 插件更新网站&#xff1a;https://github.com/subclipse/subclipse/wiki -------------------------------…

虚拟服务器关机返回用户信息,在Linux服务器关机前向用户显示一条自定义消息...

在先前的文┞仿中&#xff0c;我们说清楚明了 Linux 中 shutdown、poweroff、halt、reboot 敕令的不合之处&#xff0c;并揭示了在用不合的选项履行这些敕令时它们实际做了什么。# shutdown 13:25本篇将会向你展示如安在体系关机时向所有的体系用户发送一条自定义的消息。建议浏…

eclipse svn不能忽略文件及文件夹,ignore设置无效 ?

SVN这块做得不好&#xff0c;如果之前提交过此文件&#xff0c;就不能设置忽略该文件了。所以第一次提交的时候要搞清楚再提交。 【 亲测&#xff0c;的确如此&#xff0c;用 Windows -> Preferences -> Team -> Ignored Resources 方法不行。 项目右键--team--设置…

Sonatype Nexus 库被删除的恢复方法

原文连接&#xff1a;https://my.oschina.net/u/178116/blog/519840 --------------------有道云笔记保存---------------------------------------------- 今天在整理公司Maven私服的时候&#xff0c;不小心把Release库删掉了。瞬间冒出冷汗来了&#xff01;公司所有的积累都…

maven私有库配置

不同的项目&#xff0c;不同的私有库1、添加仓库Release 发布&#xff1b; 发行仓库snapshot 快照&#xff0c;开发&#xff0c;调试仓库配置完成2、配置权限默认开通的权限&#xff0c;查看权限给刚才建的两个私有库添加权限配置好后3、创建角色&#xff0c;分配权限添加rolei…

asc desc排序_21.数据库排序?左连接 ?右连接?

更多内容来源&#xff1a;http://mp.weixin.qq.com/mp/homepage?__bizMzA5OTQ1ODE1NQ&hid6&sn843337a7d9931839214ec8f861ac2164&scene18#wechat_redirect1、数据库排序语法 select column_name,column_name from table_name order by column_name,column_name as…

京东ajax怎么用,使用Ajax、json实现京东购物车结算界面的数据交互实例

全选商品单价数量小计操作全选删除选中产品总价&#xff1a;&#xffe5;0body,html,ul,li,a{margin:0;padding:0;font-family:"microsoft yahei";list-style:none;text-decoration:none;}.fl{float:left;}.fr{float:right;}.f12{font-size:12px;}.disl{display:inli…

maven私有库搭建

为什么要搭建maven私有库&#xff1f; 有位博主在2008年时这样写道&#xff1a; 如果没有私服&#xff0c;我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地&#xff0c;而一个团队中的所有人都重复的从maven仓库下载构件无疑加大了仓库的负载和浪费…

eclipse maven访问maven私有库

1、Windows本地maven下载 https://maven.apache.org/download.cgi 2、maven setting 文件配置 进入maven 目录下 conf。apache-maven-3.2.3\conf 新建.xml 文件&#xff0c;内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><set…

入门系列之在Ubuntu 16.04使用Buildbot建立持续集成系统

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由angel_郁发表于云社区专栏 介绍 Buildbot是一个基于Python的持续集成系统&#xff0c;用于自动化软件构建&#xff0c;测试和发布过程。 在本教程中&#xff0c;我们将演示如何设置持续集成系统以自动…

strapi 开源api 内容管理平台试用

strapi 是一个开源的api && 内容管理平台&#xff0c;功能操作起来还是比较方便简单的。 安装 使用docker && docker-compose 代码clonegit clone https://github.com/strapi/strapi-docker && cd strapi-docker 启动 docker-compose up -d 访问 首次初…

1.android体系结构介绍

一、Android的介绍 android介绍见百度百科&#xff1a;Android的介绍&#xff0c;度娘把Android介绍的这么清楚&#xff0c;如果谷歌是Android的爹&#xff0c;那度娘就是娘了。 二、Android的架构图 android系统主要分四层&#xff1a; 从上致下&#xff1a; 1、应用层 2、…

2.JVM和DVM之间的区别

1、JVM .java----->.class----->.jar 运行在内存的 栈 栈虚拟机 2、DVM .java----->.class------>.dex-----(加上其它资源文件)---->apk 运行在CPU的 寄存器 寄存器虚拟机 ---------------------------------------------------------- 3、DVM与JVM的区…

Node.js模块以及模块加载机制

2019独角兽企业重金招聘Python工程师标准>>> Node.js中的模块 在Node.js中&#xff0c;以模块为单位划分功能&#xff0c;通过一个完整的模块加载机制使得开发人员可以将应用程序划分为多个不同的部分。模块的使用可以提高代码重用率&#xff0c;提高应用程序的开发…

获取数据库名称dbName

2019独角兽企业重金招聘Python工程师标准>>> Autowired DataSource ds; connection ds.getConnection(); tring dbName connection.getCatalog(); connection.close(); 转载于:https://my.oschina.net/u/2351011/blog/1925838