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.pswp.cn/news/538097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538097.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538097.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Eclipse 中打開當前文件夾

原文連接&#xff1a;https://www.cnblogs.com/panie2015/p/5985053.html ------------------------------------------------------------------------ 最近試過好多次&#xff0c;安裝插件來 在Eclipse 中打開當前文件所在文件夾&#xff0c;結果總是不甚如意。 煩躁了&…

清華大學計算機系主任應明生,清華大學計算機科學與技術系導師簡介:應明生...

對考生而言&#xff0c;充分了解高校、專業以及師資情況是一項最基礎、最關鍵的工作。以下是中公考研小編為大家整理的“清華大學計算機科學與技術系導師簡介&#xff1a;應明生”的相關信息&#xff0c;希望對同學們有所幫助。姓名&#xff1a;應明生職稱&#xff1a;教授郵件…

在VS2013平臺下如何快速解決c++代碼內存泄漏問題

在學習FPS3000人臉關鍵點定位算法時&#xff0c;發現github上的源碼&#xff0c;存在大量的內存泄漏問題&#xff0c;在訓練的時發現內存一直在增長&#xff0c;測試的時候也存在內存無法徹底釋放的問題。 一直以為是存放模型參數vector<class>結構的問題&#xff0c; 采…

python請簡述構造函數和析構函數的作用_python – 構造函數和析構函數如何工作?...

我正在嘗試理解這段代碼&#xff1a;class Person:Represents a person population 0def __init__(self,name)://some statements and population 1def __del__(self)://some statements and population - 1def sayHi(self):grettings from personprint Hi My name is %s % s…

服務器應用日志清理,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--設置…

華為服務器產品系列號查詢,華為LIST全系列 服務器產品速查清單

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓型號 描述S5700-EI-AC-B09 S5700-52C-EI交換機(48個10/100/1000Base-T RJ45,2個10GE SFP上行口, 含堆疊卡)S5700-EI-AC-B06 S5700-28C-EI交換機(24個10/100/1000Base-T RJ45,2個10GE SFP上行口, 含堆疊卡)FC0M00S67403 S6748-EI交換…

BZOJ4300 絕世好題

目錄 BZOJ4300 絕世好題題解&#xff43;&#xff4f;&#xff44;&#xff45;BZOJ4300 絕世好題 題目傳送門 題解 比較簡單的\(DP\)&#xff0c;記\(f[i]\)表示第\(i\)位為&#xff11;&#xff0c;最長的長度為多少。只需要枚舉每一個數字&#xff0c;對于這個數字二進制下…

Sonatype Nexus 庫被刪除的恢復方法

原文連接&#xff1a;https://my.oschina.net/u/178116/blog/519840 --------------------有道云筆記保存---------------------------------------------- 今天在整理公司Maven私服的時候&#xff0c;不小心把Release庫刪掉了。瞬間冒出冷汗來了&#xff01;公司所有的積累都…

hbase 修改表名_hbase修改表名 - 張歡19933的個人空間 - OSCHINA - 中文開源技術交流社區...

hbase修改表名hbase修改表名沒有直接的api可以調用&#xff0c;我們如果想要修改表名&#xff0c;可以利用快照的方式。需要開啟快照功能&#xff0c;在hbase-site.xml文件中添加如下配置項&#xff1a;hbase.snapshot.enabledtrue命令hbase shell> disable tableNamehbase …

ajax一次輸出1萬條數據庫,后端接口一次給出100萬條數據,請問你前端怎么分頁處理...

面試官既然能這么問&#xff0c;我們從技術的角度出發&#xff0c;探索一下這道題&#xff0c;上手操作了一下&#xff1a;function loadAll(response) {var html "";for (var i 0; i < 100000; i) {html "title:" 我正在測試[i] "";}$(…

“” '' ``區別 初學者自用

單引號 相當于吧里面的內容直接輸出。并不會考慮里面是否有變量命令等雙引號 "" 只認變量 命令會直接輸出反引號 兩種都認 實例&#xff1a; a"hello" [localhost.localdomain 10:16:09]$echo echo %a輸出&#xff1a;echo %a [localhost.localdomain…

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…