opengl繪制五星紅旗
本文實(shí)例為大家分享了opengl繪制五星紅旗的具體代碼,供大家參考,具體內(nèi)容如下
主要儀器設(shè)備
VisualStudio C++2015
Windows 10環(huán)境
opengl庫
操作步驟
1.五星紅旗的各項(xiàng)參數(shù)
1) 旗面為紅色,長方形,長與高之比為3:2。
2) 五星的位置參數(shù):
·為便于確定五星之位置,先將旗面對(duì)分為四個(gè)相等的長方形,將左上方之長方形上下劃為十等分,左右劃為十五等分。如下圖所示:
·大五角星的中心點(diǎn),在該長方形上五下五、左五右十之處。其畫法為:以此點(diǎn)為圓心,以三等分為半徑作一圓。在此圓周上,定出五個(gè)等距離的點(diǎn),其一點(diǎn)須位于圓之正上方。然后將此五點(diǎn)中各相隔的兩點(diǎn)相聯(lián),使各成一直線。此五直線所構(gòu)成之外輪廓線,即為所需之大五角星。五角星之一個(gè)角尖正向上方。
·四顆小五角星的中心點(diǎn),第一點(diǎn)在該長方形上二下八、左十右五之處,第二點(diǎn)在上四下六、左十二右三之處,第三點(diǎn)在上七下三、左十二右三之處,第四點(diǎn)在上九下一、左十右五之處。其畫法為:以以上四點(diǎn)為圓心,各以一等分為半徑,分別作四個(gè)圓。在每個(gè)圓上各定出五個(gè)等距離的點(diǎn),其中均須各有一點(diǎn)位于大五角星中心點(diǎn)與以上四個(gè)圓心的各聯(lián)結(jié)線上。然后用構(gòu)成大五角星的同樣方法,構(gòu)成小五角星。此四顆小五角星均各有一個(gè)角尖正對(duì)大五角星的中心點(diǎn)。
2.繪制大五角星
因?yàn)間lut無法根據(jù)頂點(diǎn)繪制凹多邊形,我只能將圖形拆解,分步繪制。我采用的方式是將五角星分解為10個(gè)三角形,共用五角星中心點(diǎn)作為頂點(diǎn),這樣就可以使用GL_TRIANGLE_FAN(連接成扇形的三角形系列)幾何圖元類型進(jìn)行填充。對(duì)于每一個(gè)五角星,我們必須知道的參數(shù)只有兩個(gè),中心點(diǎn)和一個(gè)外頂點(diǎn)。
注意到,在連續(xù)繪制三角形的過程中,重點(diǎn)是根據(jù)A點(diǎn)求得B點(diǎn)坐標(biāo)或者反之,那么根據(jù)正弦定理,我們可以求得b邊的長度,根據(jù)BC邊的與x軸的夾角以及36°角,我們可以得到A點(diǎn)的坐標(biāo)。進(jìn)而可以得到每一個(gè)三角形另外兩點(diǎn)的坐標(biāo),一個(gè)五角星就繪制完成了。
3.繪制小五角星
小五角星的一個(gè)頂點(diǎn)必然在小五角星與大五角星的連線上,確定了這個(gè)頂點(diǎn),就可以按照繪制大五角星的方法來繪制它了。
根據(jù)大小五角星中心連線,我們又已知小五角星外接圓半徑,就可以輕易求出頂角的坐標(biāo)了。
4.窗口尺寸變化時(shí)圖形不變形
如果不加入這一部分考慮,在對(duì)窗口進(jìn)行縮放時(shí)會(huì)發(fā)生五星紅旗拉伸、變形的情況。于是增加函數(shù)glutReshapeFunc以及glOrtho函數(shù)。glutReshapFunc用以指定窗口大小調(diào)整是的重繪制函數(shù)。glOrtho是創(chuàng)建一個(gè)正交平行的視景體。changeSize函數(shù)是在窗口大小發(fā)生變化時(shí)要執(zhí)行的操作。
代碼如下:
#include "gl/glut.h"
#include <math.h>
const GLfloat PI = 3.1415926f;//定義圓周率
void DrawStar(GLfloat px, GLfloat py, GLfloat vx, GLfloat vy,int flag)//位置以及五角星一個(gè)外頂點(diǎn)坐標(biāo)
{
glBegin(GL_TRIANGLE_FAN);//繪制一系列三角形
GLfloat vtx[12], vty[12];//1個(gè)中心點(diǎn),10個(gè)頂點(diǎn),頂點(diǎn)的第一個(gè)和最后一個(gè)相同,其中奇數(shù)下標(biāo)是外頂點(diǎn),偶數(shù)下標(biāo)是內(nèi)頂點(diǎn)
vtx[0] = px;//已知的中心點(diǎn)
vty[0] = py;
vtx[1] = vx;//已知的第一個(gè)外頂點(diǎn)
vty[1] = vy;
GLfloat length1 = sqrt((px - vx)*(px - vx) + (py - vy)*(py - vy));//中心點(diǎn)到外頂點(diǎn)的長度
GLfloat length2 = length1*sin(0.1*PI) / sin(126.0 / 180 * PI);
//計(jì)算剩下的所有頂點(diǎn)
double init = atan((vty[1] - vty[0]) / (vtx[1] - vtx[0]));//頂點(diǎn)與中心點(diǎn)連線與x軸的角度
if (flag)
init = init - PI;
for (int i = 2; i < 12; i++) {
init = init - 0.2*PI;
if (i % 2 == 0) {//內(nèi)頂點(diǎn)
vtx[i] = length2*cos(init) + vtx[0];
vty[i] = length2*sin(init) + vty[0];
}
else {//外頂點(diǎn)
vtx[i] = length1*cos(init) + vtx[0];
vty[i] = length1*sin(init) + vty[0];
}
}
for (int i = 0; i < 12; i++) //設(shè)置頂點(diǎn)
glVertex3f(vtx[i], vty[i], 0.5);
glEnd();
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);//完成清除窗口的任務(wù)
//繪制紅旗
glColor3f(1, 0, 0);//確定繪制物體時(shí)使用的顏色:紅色
glBegin(GL_QUADS);
glVertex3f(-0.75, 0.5, 0.5);//位于z=0.5平面的矩形 0.5是相對(duì)值
glVertex3f(0.75, 0.5, 0.5);
glVertex3f(0.75, -0.5, 0.5);
glVertex3f(-0.75, -0.5, 0.5);
glEnd();
//繪制星星
glColor3f(1.0, 1.0, 0.0);//設(shè)置顏色為黃色
GLfloat px[5] = { -1.5 / 3,-0.75 / 3,-0.75 / 5,-0.75 / 5,-0.75 / 3 };
GLfloat py[5] = { 0.25,0.4,0.3,0.15,0.05 };
GLfloat vx[5] = { -1.5 / 3 };
GLfloat vy[5] = {0.4};//五星的中心點(diǎn)和其中指定頂點(diǎn)
//計(jì)算其余四星的頂點(diǎn)
for (int i = 1; i < 5; i++) {
vx[i] = px[i]-0.05*cos(atan((py[0] - py[i]) / (px[0] - px[i])));
vy[i] = py[i]-0.05*sin(atan((py[0] - py[i]) / (px[0] - px[i])));
}
//繪制
DrawStar(px[0], py[0], vx[0], vy[0], 0);
DrawStar(px[1], py[1], vx[1], vy[1], 1);
DrawStar(px[2], py[2], vx[2], vy[2], 1);
DrawStar(px[3], py[3], vx[3], vy[3], 1);
DrawStar(px[4], py[4], vx[4], vy[4], 1);
glutSwapBuffers();//交換緩沖區(qū)
}
void changeSize(GLsizei w, GLsizei h)
{
if (h == 0)
h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
int dis = w < h ? w : h;
glViewport(0, 0, dis, dis);
glOrtho(-1.5, 1.5, -1.5, 1.5, -1.5, 1.5);
if (w <= h)
glOrtho(-1.0, 1.0, 1.0,1.0* h / w, 1.0, -1.0);
else
glOrtho(-1.0, 1.0 * w / h, 1.0, 1.0, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main (int argc, char *argv[])
{
glutInit(&argc,argv);//對(duì)glut函數(shù)庫進(jìn)行初始化
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);//指定glutCreateWindow函數(shù)將要?jiǎng)?chuàng)建的窗口顯示模式 RGB模式 雙緩沖
glutInitWindowPosition(10, 10);//指定窗口位置,窗口的一個(gè)角相對(duì)整個(gè)屏幕的位置
glutInitWindowSize(400,400);//指定窗口大小,只是一種提示,有可能被其他窗口覆蓋
glutCreateWindow("Simple GLUT App");//打開設(shè)置好的窗口,進(jìn)入glutMainLoop之前這個(gè)窗口不會(huì)顯示
glOrtho(1.0, 1.0, 1.0, 1.0, 1.0, -1.0);
glutReshapeFunc(changeSize); //注冊(cè)窗口大小改變時(shí)回調(diào)函數(shù)
glClear(GL_COLOR_BUFFER_BIT);//完成清除窗口的任務(wù)
glutDisplayFunc(display);//與注冊(cè)相關(guān)的回調(diào)函數(shù),指定當(dāng)窗口內(nèi)容需要重繪時(shí)要調(diào)用的函數(shù)
glutMainLoop();//進(jìn)入GLUT事件處理循環(huán),永遠(yuǎn)不會(huì)返回
return 0;
}
實(shí)驗(yàn)結(jié)果:
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C++中try throw catch異常處理的用法示例
欄 目:C語言
下一篇:C++實(shí)現(xiàn)大整數(shù)乘法(字符串乘法)
本文標(biāo)題:opengl繪制五星紅旗
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/180.html
您可能感興趣的文章
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10VC運(yùn)用OPENGL加載BMP紋理圖的實(shí)現(xiàn)方法匯總
- 01-10Cocos2d-x學(xué)習(xí)筆記之世界坐標(biāo)系、本地坐標(biāo)系、opengl坐標(biāo)系、屏幕
- 01-10MFC繪制不規(guī)則窗體的方法
- 01-10使用C++繪制GDI位圖的基本編寫實(shí)例
- 01-10利用C語言的Cairo圖形庫繪制太極圖實(shí)例教程
- 01-10VC++實(shí)現(xiàn)的OpenGL線性漸變色繪制操作示例
- 01-10opengl實(shí)現(xiàn)任意兩點(diǎn)間畫圓柱體
- 01-10OpenCV繪制正多邊形的方法
- 01-10OpenCV鼠標(biāo)繪制矩形和截取矩形區(qū)域圖像


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery


