計算機圖形學(循環四邊形)

實驗要求(如圖片):



思路分析:

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;
 }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章