欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

opengl繪制五星紅旗

 更新時間:2019年09月24日 14:53:46   作者:Mokoa  
這篇文章主要為大家詳細介紹了opengl繪制五星紅旗的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了opengl繪制五星紅旗的具體代碼,供大家參考,具體內(nèi)容如下

主要儀器設(shè)備

VisualStudio C++2015

Windows 10環(huán)境
opengl庫

操作步驟

1.五星紅旗的各項參數(shù)

1) 旗面為紅色,長方形,長與高之比為3:2。
2) 五星的位置參數(shù):
·為便于確定五星之位置,先將旗面對分為四個相等的長方形,將左上方之長方形上下劃為十等分,左右劃為十五等分。如下圖所示:

·大五角星的中心點,在該長方形上五下五、左五右十之處。其畫法為:以此點為圓心,以三等分為半徑作一圓。在此圓周上,定出五個等距離的點,其一點須位于圓之正上方。然后將此五點中各相隔的兩點相聯(lián),使各成一直線。此五直線所構(gòu)成之外輪廓線,即為所需之大五角星。五角星之一個角尖正向上方。

·四顆小五角星的中心點,第一點在該長方形上二下八、左十右五之處,第二點在上四下六、左十二右三之處,第三點在上七下三、左十二右三之處,第四點在上九下一、左十右五之處。其畫法為:以以上四點為圓心,各以一等分為半徑,分別作四個圓。在每個圓上各定出五個等距離的點,其中均須各有一點位于大五角星中心點與以上四個圓心的各聯(lián)結(jié)線上。然后用構(gòu)成大五角星的同樣方法,構(gòu)成小五角星。此四顆小五角星均各有一個角尖正對大五角星的中心點。

2.繪制大五角星

因為glut無法根據(jù)頂點繪制凹多邊形,我只能將圖形拆解,分步繪制。我采用的方式是將五角星分解為10個三角形,共用五角星中心點作為頂點,這樣就可以使用GL_TRIANGLE_FAN(連接成扇形的三角形系列)幾何圖元類型進行填充。對于每一個五角星,我們必須知道的參數(shù)只有兩個,中心點和一個外頂點。

注意到,在連續(xù)繪制三角形的過程中,重點是根據(jù)A點求得B點坐標(biāo)或者反之,那么根據(jù)正弦定理,我們可以求得b邊的長度,根據(jù)BC邊的與x軸的夾角以及36°角,我們可以得到A點的坐標(biāo)。進而可以得到每一個三角形另外兩點的坐標(biāo),一個五角星就繪制完成了。

3.繪制小五角星

小五角星的一個頂點必然在小五角星與大五角星的連線上,確定了這個頂點,就可以按照繪制大五角星的方法來繪制它了。
根據(jù)大小五角星中心連線,我們又已知小五角星外接圓半徑,就可以輕易求出頂角的坐標(biāo)了。

4.窗口尺寸變化時圖形不變形

如果不加入這一部分考慮,在對窗口進行縮放時會發(fā)生五星紅旗拉伸、變形的情況。于是增加函數(shù)glutReshapeFunc以及glOrtho函數(shù)。glutReshapFunc用以指定窗口大小調(diào)整是的重繪制函數(shù)。glOrtho是創(chuàng)建一個正交平行的視景體。changeSize函數(shù)是在窗口大小發(fā)生變化時要執(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)//位置以及五角星一個外頂點坐標(biāo)
{
 glBegin(GL_TRIANGLE_FAN);//繪制一系列三角形
 GLfloat vtx[12], vty[12];//1個中心點,10個頂點,頂點的第一個和最后一個相同,其中奇數(shù)下標(biāo)是外頂點,偶數(shù)下標(biāo)是內(nèi)頂點
 vtx[0] = px;//已知的中心點
 vty[0] = py;
 vtx[1] = vx;//已知的第一個外頂點
 vty[1] = vy;
 GLfloat length1 = sqrt((px - vx)*(px - vx) + (py - vy)*(py - vy));//中心點到外頂點的長度
 GLfloat length2 = length1*sin(0.1*PI) / sin(126.0 / 180 * PI);
 //計算剩下的所有頂點
 double init = atan((vty[1] - vty[0]) / (vtx[1] - vtx[0]));//頂點與中心點連線與x軸的角度
 if (flag)
 init = init - PI;
 for (int i = 2; i < 12; i++) {
 init = init - 0.2*PI;
 if (i % 2 == 0) {//內(nèi)頂點
 vtx[i] = length2*cos(init) + vtx[0];
 vty[i] = length2*sin(init) + vty[0];
 }
 else {//外頂點
 vtx[i] = length1*cos(init) + vtx[0];
 vty[i] = length1*sin(init) + vty[0];
 }
 }
 for (int i = 0; i < 12; i++) //設(shè)置頂點
 glVertex3f(vtx[i], vty[i], 0.5);
 glEnd();
}
void display()
{
 glClear(GL_COLOR_BUFFER_BIT);//完成清除窗口的任務(wù)
 //繪制紅旗
 glColor3f(1, 0, 0);//確定繪制物體時使用的顏色:紅色
 glBegin(GL_QUADS);
 glVertex3f(-0.75, 0.5, 0.5);//位于z=0.5平面的矩形 0.5是相對值
 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};//五星的中心點和其中指定頂點
 //計算其余四星的頂點
 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);//對glut函數(shù)庫進行初始化
 glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);//指定glutCreateWindow函數(shù)將要創(chuàng)建的窗口顯示模式 RGB模式 雙緩沖
 glutInitWindowPosition(10, 10);//指定窗口位置,窗口的一個角相對整個屏幕的位置
 glutInitWindowSize(400,400);//指定窗口大小,只是一種提示,有可能被其他窗口覆蓋
 glutCreateWindow("Simple GLUT App");//打開設(shè)置好的窗口,進入glutMainLoop之前這個窗口不會顯示
 
 glOrtho(1.0, 1.0, 1.0, 1.0, 1.0, -1.0);
 glutReshapeFunc(changeSize); //注冊窗口大小改變時回調(diào)函數(shù)
 glClear(GL_COLOR_BUFFER_BIT);//完成清除窗口的任務(wù)
 glutDisplayFunc(display);//與注冊相關(guān)的回調(diào)函數(shù),指定當(dāng)窗口內(nèi)容需要重繪時要調(diào)用的函數(shù)
 glutMainLoop();//進入GLUT事件處理循環(huán),永遠不會返回
 
 return 0;
}

實驗結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++/GoLang如何實現(xiàn)自底向上的歸并排序

    C++/GoLang如何實現(xiàn)自底向上的歸并排序

    這篇文章主要給大家介紹了關(guān)于C++/GoLang如何實現(xiàn)自底向上的歸并排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 深入理解c語言數(shù)組

    深入理解c語言數(shù)組

    這篇文章主要介紹了c語言數(shù)組,有需要的朋友可以參考一下
    2013-12-12
  • C語言左旋字符串的三種實現(xiàn)方式

    C語言左旋字符串的三種實現(xiàn)方式

    本文章將使用三種思路實現(xiàn)字符串的左旋(循環(huán)移動,截取和拼接,逆序反轉(zhuǎn)),文中通過代碼示例和圖文介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-03-03
  • C語言中字符串的內(nèi)存地址操作的相關(guān)函數(shù)簡介

    C語言中字符串的內(nèi)存地址操作的相關(guān)函數(shù)簡介

    這篇文章主要介紹了C語言中字符串的內(nèi)存地址操作的相關(guān)函數(shù),包括bcopy()函數(shù)和bzero()函數(shù)以及bcmp()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C++ cin.get用法案例詳解

    C++ cin.get用法案例詳解

    這篇文章主要介紹了C++ cin.get用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++實現(xiàn)字符串類型相互轉(zhuǎn)換的代碼示例

    C++實現(xiàn)字符串類型相互轉(zhuǎn)換的代碼示例

    在C/C++編程中,字符串是非?;A(chǔ)且常用的數(shù)據(jù)類型,但是由于不同的編程語言或標(biāo)準(zhǔn)庫可能采用不同的字符串類型,因此在不同的應(yīng)用場景下可能需要進行字符串類型的相互轉(zhuǎn)換,本文將介紹如何在C/C++中將char*,std::string,QString,CString/MFC?String相互轉(zhuǎn)換
    2023-06-06
  • QT編寫簡單登錄界面的實現(xiàn)示例

    QT編寫簡單登錄界面的實現(xiàn)示例

    登陸界面是網(wǎng)頁中常見的界面,本文主要介紹了QT編寫簡單登錄界面的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • C語言版簡單掃雷游戲

    C語言版簡單掃雷游戲

    這篇文章主要為大家詳細介紹了C語言版簡單掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++判斷矩形相交的方法

    C++判斷矩形相交的方法

    這篇文章主要介紹了C++判斷矩形相交的方法,涉及C++針對平面坐標(biāo)數(shù)學(xué)運算的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Vc++ 控件List Control用法總結(jié)

    Vc++ 控件List Control用法總結(jié)

    這篇文章主要介紹了Vc++ 控件List Control用法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06

最新評論