1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <GL/glut.h>
4 #include <math.h>
5 #include "kugeltabellen.h"
6
7 #ifndef M_PI
8 #define M_PI 3.14159265358979323846
9 #endif
10
calc_ind2(GLint b,GLint c,GLint Aufloesung)11 GLint calc_ind2(GLint b, GLint c, GLint Aufloesung) {
12 return ((c*(2*Aufloesung+3-c))/2)+b;
13 }
14
Dreieck(GLfloat ax,GLfloat ay,GLfloat az,GLfloat bx,GLfloat by,GLfloat bz,GLfloat cx,GLfloat cy,GLfloat cz,GLint Aufloesung,GLint & iv,GLint & ii,GLint & it,GLfloat * vertices,GLint * indices,GLfloat * texcoord)15 void Dreieck(GLfloat ax, GLfloat ay, GLfloat az,
16 GLfloat bx, GLfloat by, GLfloat bz,
17 GLfloat cx, GLfloat cy, GLfloat cz,
18 GLint Aufloesung, GLint &iv, GLint &ii, GLint &it,
19 GLfloat *vertices,GLint *indices,GLfloat *texcoord) {
20
21 GLint c=0,b=0;
22 GLfloat orient=99;
23 GLint ivstart=iv/3;
24
25 for (c=0;c<=Aufloesung;c++) {
26 for (b=0;b<=Aufloesung-c;b++) {
27 GLfloat temp_x=ax+((b+0.0)/(Aufloesung+0.0))*(bx-ax)+((c+0.0)/(Aufloesung+0.0))*(cx-ax);
28 GLfloat temp_y=ay+((b+0.0)/(Aufloesung+0.0))*(by-ay)+((c+0.0)/(Aufloesung+0.0))*(cy-ay);
29 GLfloat temp_z=az+((b+0.0)/(Aufloesung+0.0))*(bz-az)+((c+0.0)/(Aufloesung+0.0))*(cz-az);
30 GLfloat Abstand=sqrt(temp_x*temp_x+temp_y*temp_y+temp_z*temp_z);
31 temp_x=temp_x/Abstand;
32 temp_y=temp_y/Abstand;
33 temp_z=temp_z/Abstand;
34 vertices[iv++]=temp_x;
35 vertices[iv++]=temp_y;
36 vertices[iv++]=temp_z;
37 GLfloat winkel=atan(temp_x/temp_y)/M_PI;
38 if (temp_x==0 && temp_y==0) winkel=orient;
39 if (!winkel) winkel=0;
40 if (temp_y<0) winkel+=1;
41 else if (temp_x<0) winkel+=2;
42 if (orient!=99) {
43 while (winkel<orient-.5) {winkel+=1;}
44 while (winkel>orient+.5) {winkel-=1;}
45 }
46 orient=winkel;
47 texcoord[it++]=winkel;
48 texcoord[it++]=acos(temp_z)/M_PI-1;
49 }
50 }
51
52 for (c=0;c<Aufloesung;c++) {
53 for (b=0;b<Aufloesung-c;b++) {
54 if (c!=0) {
55 indices[ii++]=ivstart+calc_ind2(b,c,Aufloesung);
56 indices[ii++]=ivstart+calc_ind2(b+1,c-1,Aufloesung);
57 indices[ii++]=ivstart+calc_ind2(b+1,c,Aufloesung);
58 }
59 indices[ii++]=ivstart+calc_ind2(b,c,Aufloesung);
60 indices[ii++]=ivstart+calc_ind2(b+1,c,Aufloesung);
61 indices[ii++]=ivstart+calc_ind2(b,c+1,Aufloesung);
62 }
63 }
64 }
65
initialisiereKugelTabellen(GLint Aufloesung)66 void initialisiereKugelTabellen(GLint Aufloesung) {
67 if (Aufloesung<1) Aufloesung=1;
68 if (Aufloesung>29) Aufloesung=29;
69
70 /*
71 GLfloat a=atan(1/1)/M_PI;
72 GLfloat b=atan(-1/1)/M_PI;
73 GLfloat c=atan(-1/-1)/M_PI;
74 GLfloat d=atan(1/-1)/M_PI;
75 printf("%f %f %f %f\n",a,b,c,d);
76 */
77
78 for (GLint A=1;A<=Aufloesung;A++) {
79 if (!ball_vertices[A]&& (A%2)) {
80 //printf("%i ",A);fflush(stdout);
81 ball_vertices[A] = (GLfloat*) malloc (20*3*(A+1)*(A+2)*sizeof(GLfloat)/2);
82 ball_indices[A] = (GLint*) malloc (20*3*A*A*sizeof(GLint));
83 ball_texcoord[A] = (GLfloat*) malloc (20*(A+1)*(A+2)*sizeof(GLfloat));
84
85 GLfloat a=sqrt(.8); // 0.8944271
86 GLfloat b=sqrt(.2); // 0.4472136
87 GLfloat c=a*sin(.4*M_PI); // 0.8506508
88 GLfloat d=a*cos(.4*M_PI); // 0.2763932
89 GLfloat e=a*sin(.8*M_PI); // 0.5257311
90 GLfloat f=a*cos(.8*M_PI); // 0.7236068
91
92 GLint iv=0,ii=0,it=0;
93
94 Dreieck(a,0,b,d,c,b,0,0,1,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//1
95 Dreieck(d,c,b,f,e,b,0,0,1,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//2
96 Dreieck(f,e,b,f,-e,b,0,0,1,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//3
97 Dreieck(f,-e,b,d,-c,b,0,0,1,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//4
98 Dreieck(d,-c,b,a,0,b,0,0,1,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//5
99
100 Dreieck(-f,-e,-b,-f,e,-b,a,0,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//6
101 Dreieck(a,0,b,-f,e,-b,d,c,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//7
102 Dreieck(-f,e,-b,-d,c,-b,d,c,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//8
103 Dreieck(d,c,b,-d,c,-b,f,e,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//9
104 Dreieck(-d,c,-b,-a,0,-b,f,e,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//10
105 Dreieck(f,e,b,-a,0,-b,f,-e,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//11
106 Dreieck(-a,0,-b,-d,-c,-b,f,-e,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//12
107 Dreieck(f,-e,b,-d,-c,-b,d,-c,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//13
108 Dreieck(-d,-c,-b,-f,-e,-b,d,-c,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//14
109 Dreieck(d,-c,b,-f,-e,-b,a,0,b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//15
110
111 Dreieck(-f,e,-b,0,0,-1,-d,c,-b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//16
112 Dreieck(-d,c,-b,0,0,-1,-a,0,-b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//17
113 Dreieck(-a,0,-b,0,0,-1,-d,-c,-b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//18
114 Dreieck(-d,-c,-b,0,0,-1,-f,-e,-b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//19
115 Dreieck(-f,-e,-b,0,0,-1,-f,e,-b,A,iv,ii,it,ball_vertices[A],ball_indices[A],ball_texcoord[A]);//20
116
117 GLint gespart=0;
118
119 for (GLint test=0;test<ii;test++) {
120 for (GLint vergleich=0;vergleich<test;vergleich++) {
121 if (ball_vertices[A][3*ball_indices[A][test]+0]==ball_vertices[A][3*ball_indices[A][vergleich]+0] &&
122 ball_vertices[A][3*ball_indices[A][test]+1]==ball_vertices[A][3*ball_indices[A][vergleich]+1] &&
123 ball_vertices[A][3*ball_indices[A][test]+2]==ball_vertices[A][3*ball_indices[A][vergleich]+2]) {
124 if (ball_texcoord[A][2*ball_indices[A][test]+0]==ball_texcoord[A][2*ball_indices[A][vergleich]+0] &&
125 ball_texcoord[A][2*ball_indices[A][test]+1]==ball_texcoord[A][2*ball_indices[A][vergleich]+1]) {
126 ball_indices[A][test]=ball_indices[A][vergleich];
127 gespart++;
128 break;
129 } else {
130 /*
131 printf("%f %f\n%f %f\n%f %f\n%f %f\n%f %f\n\n",
132 ball_vertices[A][3*ball_indices[A][test]+0],ball_vertices[A][3*ball_indices[A][vergleich]+0],
133 ball_vertices[A][3*ball_indices[A][test]+1],ball_vertices[A][3*ball_indices[A][vergleich]+1],
134 ball_vertices[A][3*ball_indices[A][test]+2],ball_vertices[A][3*ball_indices[A][vergleich]+2],
135 ball_texcoord[A][2*ball_indices[A][test]+0],ball_texcoord[A][2*ball_indices[A][vergleich]+0],
136 ball_texcoord[A][2*ball_indices[A][test]+1],ball_texcoord[A][2*ball_indices[A][vergleich]+1]);
137 */
138 }
139 }
140 }
141 }
142 //printf("gespart: %i\n",gespart);
143 }
144 }
145 }
146