⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 def_logo.c

📁 嵌入式GUI OpenGL源代码。OpenGL是嵌入式开发中常用的一种GUI系统。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * Def_logo.c
 *
 * This file is part of the openGL-logo demo.
 * (c) Henk Kok (kok@wins.uva.nl)
 *
 * Copying, redistributing, etc is permitted as long as this copyright
 * notice and the Dutch variable names :) stay in tact.
 */

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

/* some math.h's don't define M_PI */
#ifndef M_PI
#define M_PI 3.14159265359
#endif

#define ACC 8
#define ACC2 16
#define ACC3 48
#define ACC4 24
#define THLD 0.6
#define THLD2 0.8

extern int angle, rotating;
extern float progress;

GLfloat TRANS[7][3];
GLfloat ROTAXIS[7][3];
GLfloat ROT[7];

GLfloat char_El[ACC3+1][ACC][3];
GLfloat normal_El[ACC3+1][ACC][3];

GLfloat char_O[ACC4][ACC][3];
GLfloat normal_O[ACC4][ACC][3];

GLfloat char_P[ACC2][ACC][3];
GLfloat normal_P[ACC2][ACC][3];

GLfloat char_G[ACC4][ACC][3];
GLfloat normal_G[ACC4][ACC][3];

GLfloat accSIN[ACC], accCOS[ACC];

GLfloat difmat4[4] = { 0.425, 0.570, 0.664, 1.0 };
GLfloat difamb4[4] = { 0.425, 0.570, 0.664, 1.0 };
GLfloat matspec4[4] = { 0.174, 0.174, 0.174, 1.0 };

int rnd(int i)
{
	return rand()%i;
}

void groen_texture(void)
{
    glMaterialfv(GL_FRONT, GL_DIFFUSE, difmat4);
    glMaterialfv(GL_FRONT, GL_AMBIENT, difamb4);
    glMaterialfv(GL_FRONT, GL_SPECULAR, matspec4);
    glMaterialf(GL_FRONT, GL_SHININESS, 35.0);
}

void def_O(void)
{
	float a, s, c, ln;
	int i,j,k,l,m,n;
	float dx, dy;
	float dx1, dx2, dy1, dy2, dz1, dz2;
	GLfloat center_O[ACC4+4][3];
	GLfloat width_O[ACC4+4];
	for (i=0;i<ACC4;i++)
	{
		a = 2.0*((float) i)*M_PI/ACC4;
		s = 1+sin(a);
		c = cos(a);
		center_O[i][0] = c*3.8;
		center_O[i][1] = s*3.8+(s<-1.01?-0.8:(s>1.01?0.8:0)) + 0.8;
		center_O[i][2] = 0.0;
		width_O[i] = 0.6;
	}
/* I should be able to generalise this. oh well */
	for (i=0;i<ACC4;i++)
	{
		j = (i+1)%ACC4;
		k = (i+ACC4-1)%ACC4;
		for (a=0;a<ACC;a++)
		{
			c = cos(a*M_PI*2.0/ACC);
			s = sin(a*M_PI*2.0/ACC);
			dx = center_O[j][0] - center_O[k][0];
			dy = center_O[j][1] - center_O[k][1];
			ln = sqrt(dx*dx+dy*dy);
			dx = dx/ln;
			dy = dy/ln;
			char_O[i][(int) a][0] = center_O[i][0] + width_O[i] * dy * c;
			char_O[i][(int) a][1] = center_O[i][1] - width_O[i] * dx * c;
			char_O[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
		}
	}
	for (i=0;i<ACC;i++)
	{
		j = (i+1)%ACC;
		k = (i-1+ACC)%ACC;
		for (l=0;l<ACC4;l++)
		{
			m = (l+1)%ACC4;
			n = (l+ACC4-1)%ACC4;
			dx1 = char_O[m][i][0] - char_O[n][i][0];
			dy1 = char_O[m][i][1] - char_O[n][i][1];
			dz1 = char_O[m][i][2] - char_O[n][i][2];
			dx2 = char_O[l][k][0] - char_O[l][j][0];
			dy2 = char_O[l][k][1] - char_O[l][j][1];
			dz2 = char_O[l][k][2] - char_O[l][j][2];
			normal_O[l][i][0] = dy2*dz1 - dy1*dz2;
			normal_O[l][i][1] = dz2*dx1 - dz1*dx2;
			normal_O[l][i][2] = dx2*dy1 - dx1*dy2;
		}
	}
}

void def_P(void)
{
	float a, s, c, ln;
	int i,j,k,l,m,n;
	float dx, dy;
	float dx1, dx2, dy1, dy2, dz1, dz2;
	GLfloat center_P[ACC2][3];
	GLfloat width_P[ACC2];
	for (i=0;i<ACC2;i++)
	{
		a = 2.0*((float) i)*M_PI/ACC2;
		s = 1+sin(a);
		c = cos(a);
		center_P[i][0] = c*2.15;
		center_P[i][1] = s*2.1 + (s<-1.01?-0.7:(s>1.01?0.7:0)) + 0.7;
		center_P[i][2] = 0.0;
		width_P[i] = 0.5;
	}

	for (i=0;i<ACC2;i++)
	{
		j = (i+1)%ACC2;
		k = (i+ACC2-1)%ACC2;
		for (a=0;a<ACC;a++)
		{
			accCOS[(int) a] = c = cos(a*M_PI*2.0/ACC);
			accSIN[(int) a] = s = sin(a*M_PI*2.0/ACC);
			dx = center_P[j][0] - center_P[k][0];
			dy = center_P[j][1] - center_P[k][1];
			ln = sqrt(dx*dx+dy*dy);
			dx = dx/ln;
			dy = dy/ln;
			char_P[i][(int) a][0] = center_P[i][0] + width_P[i] * dy * c;
			char_P[i][(int) a][1] = center_P[i][1] - width_P[i] * dx * c;
			char_P[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
		}
	}
	for (i=0;i<ACC;i++)
	{
		j = (i+1)%ACC;
		k = (i-1+ACC)%ACC;
		for (l=0;l<ACC2;l++)
		{
			m = (l+1)%ACC2;
			n = (l+ACC2-1)%ACC2;
			dx1 = char_P[m][i][0] - char_P[n][i][0];
			dy1 = char_P[m][i][1] - char_P[n][i][1];
			dz1 = char_P[m][i][2] - char_P[n][i][2];
			dx2 = char_P[l][k][0] - char_P[l][j][0];
			dy2 = char_P[l][k][1] - char_P[l][j][1];
			dz2 = char_P[l][k][2] - char_P[l][j][2];
			normal_P[l][i][0] = dy2*dz1 - dy1*dz2;
			normal_P[l][i][1] = dz2*dx1 - dz1*dx2;
			normal_P[l][i][2] = dx2*dy1 - dx1*dy2;
		}
	}
}

void def_El(void)
{
	float a, s, c, ln;
	int i,j,k,l,m,n;
	float dx, dy;
	float dx1, dx2, dy1, dy2, dz1, dz2;
	GLfloat center_El[ACC3+3][3];
	GLfloat width_El[ACC3+3];
	for (i=0;i<ACC3+1;i++)
	{
		/* a = (ACC3/24 + i*11/12)*M_PI*2.0/ACC3; */
		a = (ACC3/8 + ((float) i)*3/4)*M_PI*2.0/ACC3;
		s = 1+sin(a);
		c = cos(a);
		center_El[i][0] = c*18.0;
		center_El[i][1] = s*9.3;
		center_El[i][2] = 0.0;
		width_El[i] = pow(3.5, sin(i*M_PI/ACC3))-0.6;
	}

	for (i=0;i<ACC3+1;i++)
	{
		j = (i+1)%ACC3;
		k = (i+ACC3-1)%ACC3;
		for (a=0;a<ACC;a++)
		{
			c = cos(a*M_PI*2.0/ACC);
			s = sin(a*M_PI*2.0/ACC);
			dx = center_El[j][0] - center_El[k][0];
			dy = center_El[j][1] - center_El[k][1];
			ln = sqrt(dx*dx+dy*dy);
			dx = dx/ln;
			dy = dy/ln;
			char_El[i][(int) a][0] = center_El[i][0] + width_El[i] * dy * c;
			char_El[i][(int) a][1] = center_El[i][1] - width_El[i] * dx * c;
			char_El[i][(int) a][2] = (s<-THLD2?-THLD2:(s>THLD2?THLD2:s));
		}
	}
	for (i=0;i<ACC+1;i++)
	{
		j = (i+1)%ACC;
		k = (i-1+ACC)%ACC;
		for (l=0;l<ACC3;l++)
		{
			m = (l+1)%ACC3;
			n = (l+ACC3-1)%ACC3;
			dx1 = char_El[m][i][0] - char_El[n][i][0];
			dy1 = char_El[m][i][1] - char_El[n][i][1];
			dz1 = char_El[m][i][2] - char_El[n][i][2];
			dx2 = char_El[l][k][0] - char_El[l][j][0];
			dy2 = char_El[l][k][1] - char_El[l][j][1];
			dz2 = char_El[l][k][2] - char_El[l][j][2];
			normal_El[l][i][0] = dy2*dz1 - dy1*dz2;
			normal_El[l][i][1] = dz2*dx1 - dz1*dx2;
			normal_El[l][i][2] = dx2*dy1 - dx1*dy2;
		}
	}
}

void def_G(void)
{
	float a, s, c, ln;
	int i,j,k,l,m,n;
	float dx, dy;
	float dx1, dx2, dy1, dy2, dz1, dz2;
	GLfloat center_G[ACC4][3];
	GLfloat width_G[ACC4];
	for (i=0;i<ACC4;i++)
	{
		a = 2.0*((float) i)*M_PI/ACC4;
		s = 1+sin(a);
		c = cos(a);
		center_G[i][0] = c*3.8;
		center_G[i][1] = s*3.8+(s<-1.01?-0.8:(s>1.01?0.8:0)) + 0.8;
		center_G[i][2] = 0.0;
		width_G[i] = 0.9;
		if (i>ACC4*3/4)
			width_G[i] = 0.9 - ((i-ACC4*3/4)*0.9)/ACC;
	}
	for (i=0;i<ACC4;i++)
	{
		j = (i+1)%ACC4;
		k = (i+ACC4-1)%ACC4;
		for (a=0;a<ACC;a++)
		{
			c = cos(a*M_PI*2.0/ACC);
			s = sin(a*M_PI*2.0/ACC);
			dx = center_G[j][0] - center_G[k][0];
			dy = center_G[j][1] - center_G[k][1];
			ln = sqrt(dx*dx+dy*dy);
			dx = dx/ln;
			dy = dy/ln;
			char_G[i][(int) a][0] = center_G[i][0] + width_G[i] * dy * c;
			char_G[i][(int) a][1] = center_G[i][1] - width_G[i] * dx * c;
			char_G[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
		}
	}
	for (i=0;i<ACC;i++)
	{
		j = (i+1)%ACC;
		k = (i-1+ACC)%ACC;
		for (l=0;l<ACC4;l++)
		{
			m = (l+1)%ACC4;
			n = (l+ACC4-1)%ACC4;
			dx1 = char_G[m][i][0] - char_G[n][i][0];
			dy1 = char_G[m][i][1] - char_G[n][i][1];
			dz1 = char_G[m][i][2] - char_G[n][i][2];
			dx2 = char_G[l][k][0] - char_G[l][j][0];
			dy2 = char_G[l][k][1] - char_G[l][j][1];
			dz2 = char_G[l][k][2] - char_G[l][j][2];
			normal_G[l][i][0] = dy2*dz1 - dy1*dz2;
			normal_G[l][i][1] = dz2*dx1 - dz1*dx2;
			normal_G[l][i][2] = dx2*dy1 - dx1*dy2;
		}
	}
}

void randomize(void)
{
	int i;
	for (i=0;i<7;i++)
	{
		TRANS[i][0] = rnd(100)-rnd(100);
		TRANS[i][1] = rnd(100)-rnd(100);
		TRANS[i][1] = rnd(100)-rnd(100);
		ROTAXIS[i][0] = rnd(100)-rnd(100);
		ROTAXIS[i][1] = rnd(100)-rnd(100);
		ROTAXIS[i][1] = rnd(100)-rnd(100);
		ROT[i]=rnd(3600)-rnd(3600);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -