實驗要求(如圖片):
思路分析:
1. 觀察實驗要求實現的圖形,發現三個圖形都有相同的特點。三個圖形大致都可以拆分爲:最外層的圓形以及內部若干個相同的小四邊形。
2. 這些相同的小四邊形可由其中一個四邊形旋轉實現,可利用for循環通過對角度的改變來循環輸出若干個四邊形,同時可在for循環內嵌入四邊形第一個點分別與第二個點和 第三個點的連線,最終通過for循環實現圖形內部所有的連線。
3. 共青團徽與普通花形中都有圓環,本程序中通過圓的參數方程,畫圓上的點,雖然各點之間沒有連線,但由於畫的點足夠多因此就無限逼近圓,再通過設置點的大小,就實 現了圓環的效果。My solution:
#include<GL/glut.h>
#include<cmath>
#include<iostream>
using namespace std;
int pointcount=12;//頂點數
float r=0.75;//圓的半徑
float sidelength=0.15;//四邊形的邊長
const float pi=3.1415926;
void myDisplay(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,1.0f,1.0f);
glRectf(-0.8f,-0.8f,0.8f,0.8f);//最外層白色矩形
if(pointcount!=12 && pointcount!=5)
glColor3f(1.0,0.0,1.0);
else if(pointcount==12)
glColor3f(0.0,0.0,1.0);////黨徽圓爲藍色
else
glColor3f(1.0,0.0,0.0);//共青團圓形爲紅色
glBegin(GL_POLYGON);//畫圓形
for(float i=0;i<360;i=i+0.5)
{
float x1=r*cos((i/180)*pi);
float y1=r*sin((i/180)*pi);
glVertex2f(x1,y1);
}
glEnd();
float x[4],y[4],x2,y2;
x[0]=y[0]=0;
float averagedegree=360.0/pointcount;//每個花瓣的角度
float averde01,averde02;//循環角度變量
averde01=90;
averde02=90-averagedegree/2;//初始化
if(pointcount==5)//求五角星中四邊形較短邊的長度
{
float dx;
dx=sin(18.0/180*pi)*r;
sidelength=dx/cos(36.0/180*pi);
}
else
sidelength=(r/2)/cos((averagedegree/2)/180*pi);//其它所畫圖形中的四邊形較短邊的長度
x[1]=sidelength*cos((averde02/180)*pi);
y[1]=sidelength*sin((averde02/180)*pi);
for(int ii=1;ii<=pointcount;ii++)//畫圓形內部的圖案,通過for循環一個一個四邊形輸出拼湊
{
if(pointcount==5)
glColor3f(1.0,1.0,0.0);//五角星爲黃色
else
glColor3f(1.0,1.0,1.0);//白色
glBegin(GL_POLYGON);
glVertex2f(0.0,0.0);//第一個點
glVertex2f(x[1],y[1]);//第二個點
x[2]=r*cos((averde01/180)*pi);
y[2]=r*sin((averde01/180)*pi);
glVertex2f(x[2],y[2]);//第三個點
averde01+=averagedegree;
averde02+=averagedegree;
x[3]=sidelength*cos((averde02/180)*pi);
y[3]=sidelength*sin((averde02/180)*pi);
glVertex2f(x[3],y[3]);//第四個點
glEnd();
if(pointcount!=12)//畫圖案內部的連線,國民黨黨徽內部無結點連線
{
if(pointcount==5)
glColor3f(0.0,0.0,0.0);//五角星內部結點連線爲黑色
else
glColor3f(1.0,0.0,0.0);//其餘圖形內部結點連線爲紅色
glBegin(GL_LINE_LOOP);
glVertex2f(x[0],y[0]);
glVertex2f(x[2],y[2]);//畫四邊形的第一個結點和第三個結點連線
glEnd();
glBegin(GL_LINE_LOOP);
glVertex2f(x[0],y[0]);
glVertex2f(x[1],y[1]);//畫四邊形的第一個結點和第二個結點的連線
glEnd();
}
x[1]=x[3];//變換座標:當前四邊形的第四個座標是下一個四邊形的第二個座標
y[1]=y[3];
}
if(pointcount==12||pointcount==5)//畫圓圈,國民黨徽內部,共青團五角星外部,其它圖形不需畫圓
{
if(pointcount==12)
{
glColor3f(0.0,0.0,1.0);//黨徽圓圈爲藍色
glPointSize(3);//圓圈
}
else
{
glColor3f(1.0,1.0,0.0);//共青團徽圓圈爲黃色
glPointSize(6);
}
glBegin(GL_POINTS);
float x3,y3;
for(float j=0;j<360;j=j+0.3)
{
if(pointcount==12)//國民黨黨徽內部圓圈
{
x3=(sidelength-0.015)*cos((j/180)*pi);
y3=(sidelength-0.015)*sin((j/180)*pi);
}
else//共青團徽最外層圓圈
{
x3=(r+0.015)*cos((j/180)*pi);
y3=(r+0.015)*sin((j/180)*pi);
}
glVertex2f(x3,y3);
}
glEnd();
}
glFlush();
}
int main(int argc,char *argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("Hello World!");
cout<<"請輸入頂點個數: 5.爲共青團團徽; 12.爲國民黨徽; 其它頂點數則輸出花形!\n";
cin>>pointcount;
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}