1. 程式人生 > >opengl學習小筆記(2)使用OpenGL繪製巢狀旋轉六邊形

opengl學習小筆記(2)使用OpenGL繪製巢狀旋轉六邊形

介個是我們的第一個實驗,對於一個對於OPENGL還有些迷糊的我們也只好認命了,好在網上也各種資源在那裡,老師也給了大的框架了!

實驗要求的最終結果:

原始碼:

#include<GL/glut.h>
#include<stdio.h>
#include<math.h>

void PlotRegularHexagon(void)  //正六邊形繪製子影象
{
 const GLfloat pi=3.14159;
 
 //定義最大半徑
 float a=300;
 //初始放置角度
 float rotAngle=0;
 
 glClear(GL_COLOR_BUFFER_BIT);
 GLint n=30;
 
 for(int i=0;i<n;i++)
 {
  float p1[]={a*cos(rotAngle),a*sin(rotAngle)};
  float p2[]={a*cos(rotAngle+pi/3),a*sin(rotAngle+pi/3)};
  float p3[]={a*cos(rotAngle+2*pi/3),a*sin(rotAngle+2*pi/3)};
  float p4[]={a*cos(rotAngle+pi),a*sin(rotAngle+pi)};
  float p5[]={a*cos(rotAngle+4*pi/3),a*sin(rotAngle+4*pi/3)};
  float p6[]={a*cos(rotAngle+5*pi/3),a*sin(rotAngle+5*pi/3)}; 
  
  rotAngle=rotAngle+pi/6;
  a=a*cos(pi/6);
  
  if(i%3==1)
   glColor3f(1.0f,0.0f,0.0f);
  else if(i%3==2)
   glColor3f(0.0f,1.0f,0.0f);
  else
   glColor3f(0.0f,0.0f,1.0f);
  
  glBegin(GL_LINE_LOOP);
  
  glVertex2fv(p1);
  glVertex2fv(p2);
  glVertex2fv(p3);
  glVertex2fv(p4);
  glVertex2fv(p5);
  glVertex2fv(p6);
  
  glEnd();
 }
 glFlush(); 
}


int main()
{
 glutInitWindowSize(600,600);
 glutInitWindowPosition(-100,-200);  
 glutCreateWindow("XXXXXXXX");  
 glClearColor(1.0,1.0,1.0,0.0);
 
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluOrtho2D(-300,300,-300,300); 
 glutDisplayFunc(PlotRegularHexagon); 
 glutMainLoop(); 
 
 return 0;
}

嗯,這個實驗中最很需要的就應該是關於這六個頂點的定位了。

首先畫一個正六邊形,然後根據不同半徑繪製同一圓心的一系列正六邊形,最後想辦法改變角度。

畫出正六邊形(中心到角點的距離 a = 300)初始角度為0 度。

確定第一個六邊形的座標位置P1~P6,然後進行第二個內切六邊形的畫圖,關於它的座標和每次旋轉角度間的關係了,附圖說明一下:

其他的嘛也沒有什麼太特別的,按照同樣的方法重複便可得到所要圖形啦。

裡面有各種問題有解答!

OPENGL真的是不錯的喲!