OpenGL二 - 画一个五角星 pentagram

使用数学计算出10个五角星的坐标,然后画出图形。

效果如下:


一直想使用Polygen画是实心的,但是Polygen对于凹的地方支持不好,会出问题,所以就使用直线画了。

数学计算可以参考一个百度提问:

http://zhidao.baidu.com/link?url=tDFNJu1UzgMaxkDvKWTVadaSwmkEpn1tLL6M-5e85M_ZcE6UHhmm7W6NmebIx9U0jyqWs8AhQUpLHv44_ldmowXbmzueJGgZhKG6PYCI2Km


如图,

A(rcos18°,rsin18°)

B(rcos90°,rsin90°)

C(rcos162°,rsin162°)

D(rcos234°,rsin234°)

E(rcos306°,rsin306°)


OF=rsin18°/sin126°=r'

F(r'cos54°,r'sin54°)

G(r'cos126°,r'sin126°)

H(r'cos198°,r'sin198°)

I(r'cos270°,r'sin272°)

J(r'cos342°,r'sin342°)


代码:

#pragma once
#include <stdio.h>
#include <GL\glew.h>
#include <GL\freeglut.h>
#include "math_3d.h"
#include <cmath>

namespace Tutorial2_pentagram
{
	GLuint VBO;
	const static double toPI = 3.1415926/180.0;
	const static double penR = 0.8;
	const static double penInR = penR * sin(18.0*toPI) / sin(126.0*toPI);
	/*
	外点
	x=Rcos(72°*k)  y=Rsin(72°*k)   k=0,1,2,3,4
	内点
	r=Rsin18°/sin36°
	x=rcos(72°*k+36°)  y=rsin(72°*k+36°)   k=0,1,2,3,4

	逆时针
	A(rcos18°,rsin18°)
	B(rcos90°,rsin90°)
	C(rcos162°,rsin162°)
	D(rcos234°,rsin234°)
	E(rcos306°,rsin306°)

	OF=rsin18°/sin126°=r'
	F(r'cos54°,r'sin54°)
	G(r'cos126°,r'sin126°)
	H(r'cos198°,r'sin198°)
	I(r'cos270°,r'sin272°)
	J(r'cos342°,r'sin342°)
	*/
	void createGeometry()
	{
		Vector3f vers[11];
		
		for (int i = 0, k = 0; i < 10; i+=2, k++)
		{
			vers[i].x = (float)(penR * cos((18.0+72.0*k)*toPI));
			vers[i].y = (float)(penR * sin((18.0+72.0*k)*toPI));
			vers[i].z = 0.0f;
			vers[i+1].x = (float)(penInR * cos((72.0*k+54.0)*toPI));
			vers[i+1].y = (float)(penInR * sin((72.0*k+54.0)*toPI));
			vers[i+1].z = 0.0f;
		}
		vers[10] = vers[0];
		glGenBuffers(1, &VBO);
		glBindBuffer(GL_ARRAY_BUFFER, VBO);
		glBufferData(GL_ARRAY_BUFFER, sizeof(vers), vers, GL_STATIC_DRAW);
	}

	static void RenderScene()
	{
		glClear(GL_COLOR_BUFFER_BIT);

		glEnableVertexAttribArray(0);
		glBindBuffer(GL_ARRAY_BUFFER, VBO);
		glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

		glDrawArrays(GL_LINE_STRIP, 0, 11);

		glDisableVertexAttribArray(0);
		glutSwapBuffers();
	}

	static void initCallBack()
	{
		glutDisplayFunc(RenderScene);
	}

	int run(int argc, char **argv)
	{
		glutInit(&argc, argv);
		glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
		glutInitWindowSize(800, 600);
		glutInitWindowPosition(50, 50);
		glutCreateWindow("Bill's Pentagram");

		initCallBack();

		GLenum res = glewInit();
		if (res != GLEW_OK)
		{
			fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
			return 1;
		}

		createGeometry();

		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

		glutMainLoop();

		return 0;
	}
}


数学头文件:

struct Vector3f
{
	float x;
	float y;
	float z;

	Vector3f()
	{
	}

	Vector3f(float _x, float _y, float _z)
	{
		x = _x;
		y = _y;
		z = _z;
	}
};


主文件中直接调用run就可以。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值