二維圖元生成:五角星繪制實例


OpenGL程序設計結構

以老版的opengl為例

// OpenGLOld.cpp : 定義控制台應用程序的入口點。
//
#include <GL/glew.h>
#include <GL/glut.h>
void init(void){
	glClearColor(1.0, 1.0, 1.0, 1.0);//設置背景色白色
}

void display(void){
	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_TRIANGLES);//圖形類型,GL_LINES為線段
		glColor3f(1.0f,0.0f,0.0f);//指定頂點顏色
		glVertex2f(100.0f,100.0f);//指定頂點坐標
		glColor3f(0.0f,1.0f,0.0f);
		glVertex2f(500.0f,100.0f);
		glColor3f(0.0f,0.0f,1.0f);
		glVertex2f(300.0f,400.0f);
	glEnd();

	//glFlush();//單緩沖時必須要,說明繪圖命令(函數)結束
	glutSwapBuffers();//交換緩沖(雙緩沖時使用)
}

void reshape(int width, int height){
	glViewport(0, 0, width, height);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0, width, 0, height);
	glMatrixMode(GL_MODELVIEW);
}

void keyboard(unsigned char key, int x, int y){
}

int main(int argc, char* argv[]){
	glutInitWindowPosition(200, 200);
	glutInitWindowSize(800, 600);
	
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);//雙緩沖,單緩沖為GLUT_SINGLE
	glutCreateWindow("OpenGL Old");
	init();

	glutDisplayFunc(display);//圖形繪制
	glutReshapeFunc(reshape);//窗口大小變化
	glutKeyboardFunc(keyboard);//鍵盤交互

	glutMainLoop();

	return 0;
}

遇到的問題:gluOrtho2D(0, width, 0, height);有問題,查了很多資料也解決不了

所以就改成glOrtho(-width,width,-height,height, -1,1); 在原理上等於glOrtho(-width,width,-height,height)

這個函數的功能:待更

繪圖實例

線段

  • glBegin(GL_LINES)//畫線
  • glBegin(GL_LINE_STRIP)
  • glBegin(GL_LINE_LOOP)
//一條線
glColor3f(0,0,1);
glBegin(GL_LINES);
glVertex2f(-110,0);
glVertex2f(-200,30);		
glEnd();
//圖形線圍成圖形
glBegin(GL_LINE_LOOP); 
glVertex2f(30,30); 
glVertex2f(100,100); 
glVertex2f(100,200); 
glVertex2f(50,100); 
glEnd();

填充圖形

  • glBegin(GL_POLYGON)
glColor3f(0,1,0);
glBegin(GL_POLYGON);
glVertex2f(110,0);
glVertex2f(200,0);
glVertex2f(200,30);
glVertex2f(110,30);
glEnd();

五角星原理

其實是一大一小的圓,然后按照五等分得到的點

我們需要知道大小圓的半徑\(R\)\(r\),圓心坐標\((x_c,y_c)\),和夾角\(\theta\)

先確定第一個小三角形的兩個坐標,然后旋轉

旋轉是通過弧度制,弧度加上五等分的角\(\alpha\) 就行

實現代碼

Π可以直接通過cos(-1.0)得到

外圓點的角度初值為p=Π/2,內圓的初始值為p=Π/2+theta

為了兩種顏色的質感,奇偶不同顏色

#include <iostream>
#include <cmath>
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>

// GLFW
#include <GLFW/glfw3.h>

#include <GL/glut.h>

using namespace std;
const float pai = acos(-1.0);
const float alpha = 0.4*pai;
//初始化背景
void init() {
    glClearColor(0, 0, 0, 0);
    glMatrixMode(GL_PROJECTION);
}


void draw(int cx,int cy, float R, float r, float theta){
    float *x,*y;
    x = new float[10],y=new float[10];
    float p = pai/2;
    for(int i = 0;i < 10;i += 2){
        x[i] = R*cos(p);
        y[i] = R*sin(p);
        p += alpha;
    }
    p = pai/2+theta;
    for(int i = 1;i < 10;i += 2){
        x[i] = r*cos(p);
        y[i] = r*sin(p);
        p += alpha;
    }
    for(int i = 0;i < 10;++i){
        glColor3f(1 ,0 ,0);
        glBegin(GL_LINES);
        glVertex2f(x[i],y[i]);
        glVertex2f(x[(i + 1) % 10],y[(i + 1) % 10]);
        glEnd();
    }
    for(int i = 0;i < 10;++i){
       if(i & 1) glColor3f(1 ,0 ,0);
       else glColor3f(1 ,1 ,0);
        glBegin(GL_POLYGON);
        glVertex2f(x[i],y[i]);
        glVertex2f(x[(i + 1) % 10],y[(i + 1) % 10]);
        glVertex2f(cx,cy);
        glEnd();
    }
    glutSwapBuffers();
    delete []x;
    delete []y;

}
//生成五角星
void display() {
    draw(0,0,200,100,0.2*pai);
}
void reshape(int width, int height) {
    glViewport(0, 0, width, height);
    glOrtho(-width,width,-height,height, -1,1);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char *argv[]) {
   glutInit(&argc, argv);
    glutInitWindowPosition(200,200);
    glutInitWindowSize(800, 600);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutCreateWindow("DEMO PHY");

    init();

    glutDisplayFunc(display);
    glutReshapeFunc(reshape);

    glutMainLoop();
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM