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