PageSourceSearch

https://ssz.fr/disputes/protovis_dymaxion.js

js ssz.fr collected 2026-09-26 06:45:50 UTC 21,944 bytes, 664 lines download raw bytes

1/************************************************************************/
2/* NOTE: in C, array indexing starts with element zero(0).  I choose   */
3/*       to start my array indexing with elemennt one(1) so all arrays */
4/*       are defined one element longer than they need to be.           */
5/************************************************************************/
6
7/************************************************************************/
8/* global variables accessable to all procedures                        */
9/************************************************************************/
10
11const SQRT_3  = Math.sqrt(3);
12const SQRT_5  = Math.sqrt(5);
13const SQRT_8  = Math.sqrt(8);
14const SQRT_10 = Math.sqrt(10);
15const SQRT_15 = Math.sqrt(15);
16
17var v_x = new Array(13);
18var v_y = new Array(13);
19var v_z = new Array(13);
20var center_x = new Array(21);
21var center_y = new Array(21);
22var center_z = new Array(21);
23var garc, gt, gdve, gel;
24
25
26/****************************************/
27/*      function definitions            */
28/****************************************/
29var last_lng = 100000;
30var last_lat = 100000;
31var last_point;
32function convert_s_t_p_cache(lng, lat) {
33  if(last_lng == lng && last_lat == lat) {
34    return last_point;
35  } else {
36    last_lng = lng;
37    last_lat = lat;
38    last_point = convert_s_t_p(lng, lat);
39    return last_point;
40  }
41}
42
43function convert_s_t_p(lng, lat) {
44  /***********************************************************/
45  /* This is the main control procedure.                     */
46  /***********************************************************/
47
48  /* Convert the given(long.,lat.) coordinate into spherical */
49  /* polar coordinates(r, theta, phi) with radius=1.         */
50  /* Angles are given in radians, NOT degrees.               */
51
52  // var sc = conv_ll_t_sc(lng, lat);
53  var sc = recalc_radians(lng,lat);
54  
55  // var sc = new Object();
56  // var π = Math.PI;
57  // sc.theta = (π/2) - lat;
58  // sc.phi = lng;
59
60
61  /* convert the spherical polar coordinates into cartesian   */
62  /* (x, y, z) coordinates.                                   */
63
64  var h = s_to_c(sc.theta, sc.phi);
65
66  /* determine which of the 20 spherical icosahedron triangles */
67  /* the given point is in and the LCD triangle.               */
68
69  var info = s_tri_info(h.x, h.y, h.z);
70
71  /* Determine the corresponding Fuller map plane(x, y) point */
72  return dymax_point(info.tri, info.hlcd, h.x, h.y, h.z);
73}
74
75
76function convert_i_t_p(i, t) {
77  var x = 0;
78  var y = 0;
79  var z = 0;
80  
81  // We need to 'nudge' the point a little bit into the triangle
82  // Hence we do a weighted average with point i having a massive weight
83  for(var j = 0; j < 3; j++) {
84    if(t[j] == i) {
85      x += v_x[i] * 0.9999;
86      y += v_y[i] * 0.9999;
87      z += v_z[i] * 0.9999;
88    } else {
89      x += v_x[t[j]] * 0.00005;
90      y += v_y[t[j]] * 0.00005;
91      z += v_z[t[j]] * 0.00005;
92    }
93  }
94  
95  var info = s_tri_info(x, y, z);
96  /* Determine the corresponding Fuller map plane(x, y) point */
97
98  return dymax_point(info.tri, info.hlcd, x, y, z);
99}
100
101
102function conv_ll_t_sc(lng, lat) {
103  /* convert(long., lat.) point into spherical polar coordinates */
104  /* with r=radius=1.  Angles are given in radians.               */
105  var sc = new Object();
106  var h_theta, h_phi;
107 
108  h_theta = 90.0 - lat ;
109  h_phi = lng;
110  if(lng < 0.0) {h_phi = lng + 360.0;}
111  sc.theta = radians(h_theta);
112  sc.phi = radians(h_phi);
113
114  return sc;
115} /* end conv_ll_t_sc */
116
117function recalc_radians(λ, φ) {
118  /* convert(long., lat.) point into spherical polar coordinates */
119  /* with r=radius=1.  Angles are given in radians.               */
120  var sc = new Object();
121  sc.theta = (Math.PI/2) - φ;
122  sc.phi = λ;
123
124  return sc;
125} /* end conv_ll_t_sc */
126
127function radians(degrees) {
128    /* convert angles in degrees into angles in radians */
129    return(Math.PI * degrees / 180);
130} /* end of radians function */
131
132
133function init_stuff() {
134   /* initializes the global variables which includes the */
135   /* vertix coordinates and mid-face coordinates.        */
136
137   var i, hold_x, hold_y, hold_z, magn;
138   var theta, phi;
139
140   /* Cartesian coordinates for the 12 vertices of icosahedron */
141
142   v_x[1] =    0.420152426708710003;
143   v_y[1] =    0.078145249402782959;
144   v_z[1] =    0.904082550615019298;
145   v_x[2] =    0.995009439436241649;
146   v_y[2] =   -0.091347795276427931;
147   v_z[2] =    0.040147175877166645;
148   v_x[3] =    0.518836730327364437;
149   v_y[3] =    0.835420380378235850;
150   v_z[3] =    0.181331837557262454;
151   v_x[4] =   -0.414682225320335218;
152   v_y[4] =    0.655962405434800777;
153   v_z[4] =    0.630675807891475371;
154   v_x[5] =   -0.515455959944041808;
155   v_y[5] =   -0.381716898287133011;
156   v_z[5] =    0.767200992517747538;
157   v_x[6] =    0.355781402532944713;
158   v_y[6] =   -0.843580002466178147;
159   v_z[6] =    0.402234226602925571;
160   v_x[7] =    0.414682225320335218;
161   v_y[7] =   -0.655962405434800777;
162   v_z[7] =   -0.630675807891475371;
163   v_x[8] =    0.515455959944041808;
164   v_y[8] =    0.381716898287133011;
165   v_z[8] =   -0.767200992517747538;
166   v_x[9] =   -0.355781402532944713;
167   v_y[9] =    0.843580002466178147;
168   v_z[9] =   -0.402234226602925571;
169   v_x[10] =  -0.995009439436241649;
170   v_y[10] =   0.091347795276427931;
171   v_z[10] =  -0.040147175877166645;
172   v_x[11] =  -0.518836730327364437;
173   v_y[11] =  -0.835420380378235850;
174   v_z[11] =  -0.181331837557262454;
175   v_x[12] =  -0.420152426708710003;
176   v_y[12] =  -0.078145249402782959;
177   v_z[12] =  -0.904082550615019298;
178
179   /* now calculate mid face coordinates             */
180
181   hold_x = (v_x[1] + v_x[2] + v_x[3]) / 3.0 ;
182   hold_y = (v_y[1] + v_y[2] + v_y[3]) / 3.0 ;
183   hold_z = (v_z[1] + v_z[2] + v_z[3]) / 3.0 ;
184   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
185   center_x[1] = hold_x / magn;
186   center_y[1] = hold_y / magn;
187   center_z[1] = hold_z / magn;
188
189   hold_x = (v_x[1] + v_x[3] + v_x[4]) / 3.0 ;
190   hold_y = (v_y[1] + v_y[3] + v_y[4]) / 3.0 ;
191   hold_z = (v_z[1] + v_z[3] + v_z[4]) / 3.0 ;
192   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
193   center_x[2] = hold_x / magn;
194   center_y[2] = hold_y / magn;
195   center_z[2] = hold_z / magn;
196
197   hold_x = (v_x[1] + v_x[4] + v_x[5]) / 3.0 ;
198   hold_y = (v_y[1] + v_y[4] + v_y[5]) / 3.0 ;
199   hold_z = (v_z[1] + v_z[4] + v_z[5]) / 3.0 ;
200   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
201   center_x[3] = hold_x / magn;
202   center_y[3] = hold_y / magn;
203   center_z[3] = hold_z / magn;
204
205   hold_x = (v_x[1] + v_x[5] + v_x[6]) / 3.0 ;
206   hold_y = (v_y[1] + v_y[5] + v_y[6]) / 3.0 ;
207   hold_z = (v_z[1] + v_z[5] + v_z[6]) / 3.0 ;
208   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
209   center_x[4] = hold_x / magn;
210   center_y[4] = hold_y / magn;
211   center_z[4] = hold_z / magn;
212
213   hold_x = (v_x[1] + v_x[2] + v_x[6]) / 3.0 ;
214   hold_y = (v_y[1] + v_y[2] + v_y[6]) / 3.0 ;
215   hold_z = (v_z[1] + v_z[2] + v_z[6]) / 3.0 ;
216   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
217   center_x[5] = hold_x / magn;
218   center_y[5] = hold_y / magn;
219   center_z[5] = hold_z / magn;
220
221   hold_x = (v_x[2] + v_x[3] + v_x[8]) / 3.0 ;
222   hold_y = (v_y[2] + v_y[3] + v_y[8]) / 3.0 ;
223   hold_z = (v_z[2] + v_z[3] + v_z[8]) / 3.0 ;
224   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
225   center_x[6] = hold_x / magn;
226   center_y[6] = hold_y / magn;
227   center_z[6] = hold_z / magn;
228
229   hold_x = (v_x[8] + v_x[3] + v_x[9]) / 3.0 ;
230   hold_y = (v_y[8] + v_y[3] + v_y[9]) / 3.0 ;
231   hold_z = (v_z[8] + v_z[3] + v_z[9]) / 3.0 ;
232   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
233   center_x[7] = hold_x / magn;
234   center_y[7] = hold_y / magn;
235   center_z[7] = hold_z / magn;
236
237   hold_x = (v_x[9] + v_x[3] + v_x[4]) / 3.0 ;
238   hold_y = (v_y[9] + v_y[3] + v_y[4]) / 3.0 ;
239   hold_z = (v_z[9] + v_z[3] + v_z[4]) / 3.0 ;
240   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
241   center_x[8] = hold_x / magn;
242   center_y[8] = hold_y / magn;
243   center_z[8] = hold_z / magn;
244
245   hold_x = (v_x[10] + v_x[9] + v_x[4]) / 3.0 ;
246   hold_y = (v_y[10] + v_y[9] + v_y[4]) / 3.0 ;
247   hold_z = (v_z[10] + v_z[9] + v_z[4]) / 3.0 ;
248   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
249   center_x[9] = hold_x / magn;
250   center_y[9] = hold_y / magn;
251   center_z[9] = hold_z / magn;
252
253   hold_x = (v_x[5] + v_x[10] + v_x[4]) / 3.0 ;
254   hold_y = (v_y[5] + v_y[10] + v_y[4]) / 3.0 ;
255   hold_z = (v_z[5] + v_z[10] + v_z[4]) / 3.0 ;
256   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
257   center_x[10] = hold_x / magn;
258   center_y[10] = hold_y / magn;
259   center_z[10] = hold_z / magn;
260
261   hold_x = (v_x[5] + v_x[11] + v_x[10]) / 3.0 ;
262   hold_y = (v_y[5] + v_y[11] + v_y[10]) / 3.0 ;
263   hold_z = (v_z[5] + v_z[11] + v_z[10]) / 3.0 ;
264   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
265   center_x[11] = hold_x / magn;
266   center_y[11] = hold_y / magn;
267   center_z[11] = hold_z / magn;
268
269   hold_x = (v_x[5] + v_x[6] + v_x[11]) / 3.0 ;
270   hold_y = (v_y[5] + v_y[6] + v_y[11]) / 3.0 ;
271   hold_z = (v_z[5] + v_z[6] + v_z[11]) / 3.0 ;
272   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
273   center_x[12] = hold_x / magn;
274   center_y[12] = hold_y / magn;
275   center_z[12] = hold_z / magn;
276
277   hold_x = (v_x[11] + v_x[6] + v_x[7]) / 3.0 ;
278   hold_y = (v_y[11] + v_y[6] + v_y[7]) / 3.0 ;
279   hold_z = (v_z[11] + v_z[6] + v_z[7]) / 3.0 ;
280   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
281   center_x[13] = hold_x / magn;
282   center_y[13] = hold_y / magn;
283   center_z[13] = hold_z / magn;
284
285   hold_x = (v_x[7] + v_x[6] + v_x[2]) / 3.0 ;
286   hold_y = (v_y[7] + v_y[6] + v_y[2]) / 3.0 ;
287   hold_z = (v_z[7] + v_z[6] + v_z[2]) / 3.0 ;
288   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
289   center_x[14] = hold_x / magn;
290   center_y[14] = hold_y / magn;
291   center_z[14] = hold_z / magn;
292
293   hold_x = (v_x[8] + v_x[7] + v_x[2]) / 3.0 ;
294   hold_y = (v_y[8] + v_y[7] + v_y[2]) / 3.0 ;
295   hold_z = (v_z[8] + v_z[7] + v_z[2]) / 3.0 ;
296   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
297   center_x[15] = hold_x / magn;
298   center_y[15] = hold_y / magn;
299   center_z[15] = hold_z / magn;
300
301   hold_x = (v_x[12] + v_x[9] + v_x[8]) / 3.0 ;
302   hold_y = (v_y[12] + v_y[9] + v_y[8]) / 3.0 ;
303   hold_z = (v_z[12] + v_z[9] + v_z[8]) / 3.0 ;
304   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
305   center_x[16] = hold_x / magn;
306   center_y[16] = hold_y / magn;
307   center_z[16] = hold_z / magn;
308
309   hold_x = (v_x[12] + v_x[9] + v_x[10]) / 3.0 ;
310   hold_y = (v_y[12] + v_y[9] + v_y[10]) / 3.0 ;
311   hold_z = (v_z[12] + v_z[9] + v_z[10]) / 3.0 ;
312   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
313   center_x[17] = hold_x / magn;
314   center_y[17] = hold_y / magn;
315   center_z[17] = hold_z / magn;
316
317   hold_x = (v_x[12] + v_x[11] + v_x[10]) / 3.0 ;
318   hold_y = (v_y[12] + v_y[11] + v_y[10]) / 3.0 ;
319   hold_z = (v_z[12] + v_z[11] + v_z[10]) / 3.0 ;
320   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
321   center_x[18] = hold_x / magn;
322   center_y[18] = hold_y / magn;
323   center_z[18] = hold_z / magn;
324
325   hold_x = (v_x[12] + v_x[11] + v_x[7]) / 3.0 ;
326   hold_y = (v_y[12] + v_y[11] + v_y[7]) / 3.0 ;
327   hold_z = (v_z[12] + v_z[11] + v_z[7]) / 3.0 ;
328   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
329   center_x[19] = hold_x / magn;
330   center_y[19] = hold_y / magn;
331   center_z[19] = hold_z / magn;
332
333   hold_x = (v_x[12] + v_x[8] + v_x[7]) / 3.0 ;
334   hold_y = (v_y[12] + v_y[8] + v_y[7]) / 3.0 ;
335   hold_z = (v_z[12] + v_z[8] + v_z[7]) / 3.0 ;
336   magn = Math.sqrt(hold_x * hold_x + hold_y * hold_y + hold_z * hold_z);
337   center_x[20] = hold_x / magn;
338   center_y[20] = hold_y / magn;
339   center_z[20] = hold_z / magn;
340
341   garc = 2.0 * Math.asin( Math.sqrt( 5 - SQRT_5) / SQRT_10 );
342   gt = garc / 2.0;
343
344   gdve = Math.sqrt( 3 + SQRT_5 ) / Math.sqrt( 5 + SQRT_5 );
345   gel = SQRT_8 / Math.sqrt(5 + SQRT_5);
346} /* end of int_stuff procedure */
347
348
349function s_to_c(theta, phi) {
350    /* Covert spherical polar coordinates to cartesian coordinates. */
351    /* The angles are given in radians.                             */
352    var c = new Object();
353    c.x = Math.sin(theta) * Math.cos(phi);
354    c.y = Math.sin(theta) * Math.sin(phi);
355    c.z = Math.cos(theta);
356    
357    return c;
358 } /* end s_to_c */
359
360
361function c_to_s(x, y, z) {
362    /* convert cartesian coordinates into spherical polar coordinates. */
363    /* The angles are given in radians.                                */
364    var s = new Object();
365    var a;
366
367    if(x>0.0 && y>0.0) {a = radians(0.0);}
368    if(x<0.0 && y>0.0) {a = radians(180.0);}
369    if(x<0.0 && y<0.0) {a = radians(180.0);}
370    if(x>0.0 && y<0.0) {a = radians(360.0);}
371    s.lat = Math.acos(z);
372    if(x==0.0 && y>0.0) {s.lng = radians(90.0);}
373    if(x==0.0 && y<0.0) {s.lng = radians(270.0);}
374    if(x>0.0 && y==0.0) {s.lng = radians(0.0);}
375    if(x<0.0 && y==0.0) {s.lng = radians(180.0);}
376    if(x!=0.0 && y!=0.0){s.lng = Math.atan(y/x) + a;}
377    
378    return s;
379} /* end c_to_s */
380
381
382function s_tri_info(x, y, z) {
383  /* Determine which triangle and LCD triangle the point is in. */
384
385  var h_dist1, h_dist2, h_dist3, h1, h2, h3; // double
386  var i, h_tri, h_lcd ;  //int
387  var v1, v2, v3;       // int
388  
389  var info = new Object();
390
391  h_tri = 0;
392  h_dist1 = 9999.0;
393
394  /* Which triangle face center is the closest to the given point */
395  /* is the triangle in which the given point is in.              */
396
397  for(i = 1; i <=20; i = i + 1) {
398     h1 = center_x[i] - x;
399     h2 = center_y[i] - y;
400     h3 = center_z[i] - z;
401     h_dist2 = Math.sqrt(h1 * h1 + h2 * h2 + h3 * h3);
402     if(h_dist2 < h_dist1) {
403        h_tri = i;
404        h_dist1 = h_dist2;
405      } /* end the if statement */
406   }  /* end the for statement */
407
408   info.tri = h_tri;
409
410   /* Now the LCD triangle is determined. */
411
412   switch(h_tri)
413   {
414    case 1:  v1 =  1; v2 =  3; v3 =  2; break;
415    case 2:  v1 =  1; v2 =  4; v3 =  3; break;
416    case 3:  v1 =  1; v2 =  5; v3 =  4; break;
417    case 4:  v1 =  1; v2 =  6; v3 =  5; break;
418    case 5:  v1 =  1; v2 =  2; v3 =  6; break;
419    case 6:  v1 =  2; v2 =  3; v3 =  8; break;
420    case 7:  v1 =  3; v2 =  9; v3 =  8; break;
421    case 8:  v1 =  3; v2 =  4; v3 =  9; break;
422    case 9:  v1 =  4; v2 = 10; v3 =  9; break;
423    case 10: v1 =  4; v2 =  5; v3 = 10; break;
424    case 11: v1 =  5; v2 = 11; v3 = 10; break;
425    case 12: v1 =  5; v2 =  6; v3 = 11; break;
426    case 13: v1 =  6; v2 =  7; v3 = 11; break;
427    case 14: v1 =  2; v2 =  7; v3 =  6; break;
428    case 15: v1 =  2; v2 =  8; v3 =  7; break;
429    case 16: v1 =  8; v2 =  9; v3 = 12; break;
430    case 17: v1 =  9; v2 = 10; v3 = 12; break;
431    case 18: v1 = 10; v2 = 11; v3 = 12; break;
432    case 19: v1 = 11; v2 =  7; v3 = 12; break;
433    case 20: v1 =  8; v2 = 12; v3 =  7; break;
434   } /* end of switch statement */
435
436   h1 = x - v_x[v1];
437   h2 = y - v_y[v1];
438   h3 = z - v_z[v1];
439   h_dist1 = Math.sqrt(h1 * h1 + h2 * h2 + h3 * h3);
440
441   h1 = x - v_x[v2];
442   h2 = y - v_y[v2];
443   h3 = z - v_z[v2];
444   h_dist2 = Math.sqrt(h1 * h1 + h2 * h2 + h3 * h3);
445
446   h1 = x - v_x[v3];
447   h2 = y - v_y[v3];
448   h3 = z - v_z[v3];
449   h_dist3 = Math.sqrt(h1 * h1 + h2 * h2 + h3 * h3);
450
451   if( (h_dist1 <= h_dist2) && (h_dist2 <= h_dist3) ) {h_lcd = 1; }
452   if( (h_dist1 <= h_dist3) && (h_dist3 <= h_dist2) ) {h_lcd = 6; }
453   if( (h_dist2 <= h_dist1) && (h_dist1 <= h_dist3) ) {h_lcd = 2; }
454   if( (h_dist2 <= h_dist3) && (h_dist3 <= h_dist1) ) {h_lcd = 3; }
455   if( (h_dist3 <= h_dist1) && (h_dist1 <= h_dist2) ) {h_lcd = 5; }
456   if( (h_dist3 <= h_dist2) && (h_dist2 <= h_dist1) ) {h_lcd = 4; }
457
458   info.hlcd = h_lcd;
459
460   return info;
461} /* end s_tri_info */
462
463
464function dymax_point(tri, lcd, x, y, z) {
465  var axis, v1;  // int
466  var h;
467
468  var gs; // double
469  var gx, gy, gz, ga1,ga2,ga3,ga1p,ga2p,ga3p,gxp,gyp,gzp; // double
470
471  /* In order to rotate the given point into the template spherical */
472  /* triangle, we need the spherical polar coordinates of the center */
473  /* of the face and one of the face vertices. So set up which vertex */
474  /* to use.                                                          */
475
476   switch(tri)
477   {
478    case 1:  v1 =  1;  break;
479    case 2:  v1 =  1;  break;
480    case 3:  v1 =  1;  break;
481    case 4:  v1 =  1;  break;
482    case 5:  v1 =  1;  break;
483    case 6:  v1 =  2;  break;
484    case 7:  v1 =  3;  break;
485    case 8:  v1 =  3;  break;
486    case 9:  v1 =  4;  break;
487    case 10: v1 =  4;  break;
488    case 11: v1 =  5;  break;
489    case 12: v1 =  5;  break;
490    case 13: v1 =  6;  break;
491    case 14: v1 =  2;  break;
492    case 15: v1 =  2;  break;
493    case 16: v1 =  8;  break;
494    case 17: v1 =  9;  break;
495    case 18: v1 = 10;  break;
496    case 19: v1 = 11;  break;
497    case 20: v1 =  8;  break;
498   } /* end of switch statement */
499
500   var h0 = new Object();
501   h0.x = x;
502   h0.y = y;
503   h0.z = z;
504
505   var h1 = new Object();
506   h1.x = v_x[v1];
507   h1.y = v_y[v1];
508   h1.z = v_z[v1];
509
510   h = c_to_s(center_x[tri], center_y[tri], center_z[tri]);
511
512   axis = 3;
513   rotate3d(axis,h.lng,h0);
514   rotate3d(axis,h.lng,h1);
515
516   axis = 2;
517   rotate3d(axis,h.lat,h0);
518   rotate3d(axis,h.lat,h1);
519
520   h = c_to_s(h1.x,h1.y,h1.z);
521   h.lng = h.lng - radians(90.0);
522
523   axis = 3;
524   rotate3d(axis,h.lng,h0);
525
526   /* exact transformation equations */
527
528   gz = Math.sqrt(1 - h0.x * h0.x - h0.y * h0.y);
529   gs = Math.sqrt( 5 + 2 * SQRT_5 ) / ( gz * SQRT_15 );
530
531   gxp = h0.x * gs ;
532   gyp = h0.y * gs ;
533
534   ga1p = 2.0 * gyp / SQRT_3 + (gel / 3.0) ;
535   ga2p = gxp - (gyp / SQRT_3) +  (gel / 3.0) ;
536   ga3p = (gel / 3.0) - gxp - (gyp / SQRT_3);
537
538   ga1 = gt + Math.atan( (ga1p - 0.5 * gel) / gdve);
539   ga2 = gt + Math.atan( (ga2p - 0.5 * gel) / gdve);
540   ga3 = gt + Math.atan( (ga3p - 0.5 * gel) / gdve);
541
542   gx = 0.5 * (ga2 - ga3) ;
543
544   gy = (1.0 / (2.0 * SQRT_3) ) * (2 * ga1 - ga2 - ga3);
545
546   /* Re-scale so plane triangle edge length is 1. */
547
548   var pt = new Object();
549   pt.x = gx / garc;
550   pt.y = gy / garc;
551
552  /* rotate and translate to correct position          */
553  var point2d = new Object();
554  
555  switch(tri)
556   {
557     case  1: rotate2d(240.0,pt);
558          point2d.x = pt.x + 2.0; point2d.y = pt.y + 7.0 / (2.0 * SQRT_3) ; break;
559     case  2: rotate2d(300.0, pt); point2d.x = pt.x + 2.0;
560              point2d.y = pt.y + 5.0 / (2.0 * SQRT_3) ; break;
561     case  3: rotate2d(0.0, pt);
562             point2d.x = pt.x + 2.5; point2d.y = pt.y + 2.0 / SQRT_3; break;
563     case  4: rotate2d(60.0, pt);
564              point2d.x = pt.x + 3.0; point2d.y = pt.y + 5.0 / (2.0 * SQRT_3) ; break;
565     case  5: rotate2d(180.0, pt);
566          point2d.x = pt.x + 2.5; point2d.y = pt.y + 4.0 * SQRT_3 / 3.0; break;
567     case  6: rotate2d(300.0, pt);
568              point2d.x = pt.x + 1.5; point2d.y = pt.y + 4.0 * SQRT_3 / 3.0; break;
569     case  7: rotate2d(300.0, pt);
570              point2d.x = pt.x + 1.0; point2d.y = pt.y + 5.0 / (2.0 * SQRT_3) ; break;
571     case  8: rotate2d(0.0, pt);
572              point2d.x = pt.x + 1.5; point2d.y = pt.y + 2.0 / SQRT_3; break;
573     case  9: if(lcd > 2)
574          {
575          rotate2d(300.0, pt);
576          point2d.x = pt.x + 1.5; point2d.y = pt.y + 1.0 / SQRT_3;
577          }
578          else
579          {
580          rotate2d(0.0, pt);
581          point2d.x = pt.x + 2.0; point2d.y = pt.y + 1.0 / (2.0 * SQRT_3);
582          }
583          break;
584
585     case 10: rotate2d(60.0, pt);
586              point2d.x = pt.x + 2.5; point2d.y = pt.y + 1.0 / SQRT_3; break;
587     case 11: rotate2d(60.0, pt);
588              point2d.x = pt.x + 3.5; point2d.y = pt.y + 1.0 / SQRT_3; break;
589     case 12: rotate2d(120.0, pt);
590              point2d.x = pt.x + 3.5; point2d.y = pt.y + 2.0 / SQRT_3; break;
591     case 13: rotate2d(60.0, pt);
592              point2d.x = pt.x + 4.0; point2d.y = pt.y + 5.0 / (2.0 * SQRT_3); break;
593     case 14: rotate2d(0.0, pt);
594          point2d.x = pt.x + 4.0; point2d.y = pt.y + 7.0 / (2.0 * SQRT_3) ; break;
595     case 15: rotate2d(0.0, pt);
596          point2d.x = pt.x + 5.0; point2d.y = pt.y + 7.0 / (2.0 * SQRT_3) ; break;
597     case 16: if(lcd < 4)
598          {
599        rotate2d(60.0, pt);
600        point2d.x = pt.x + 0.5; point2d.y = pt.y + 1.0 / SQRT_3;
601           }
602           else
603           {
604        rotate2d(0.0, pt);
605        point2d.x = pt.x + 5.5; point2d.y = pt.y + 2.0 / SQRT_3;
606           }
607           break;
608     case 17: rotate2d(0.0, pt);
609          point2d.x = pt.x + 1.0; point2d.y = pt.y + 1.0 / (2.0 * SQRT_3); break;
610     case 18: rotate2d(120.0, pt);
611              point2d.x = pt.x + 4.0; point2d.y = pt.y + 1.0 / (2.0 * SQRT_3); break;
612     case 19: rotate2d(120.0, pt);
613              point2d.x = pt.x + 4.5; point2d.y = pt.y + 2.0 / SQRT_3; break;
614     case 20: rotate2d(300.0, pt);
615              point2d.x = pt.x + 5.0; point2d.y = pt.y + 5.0 / (2.0 * SQRT_3); break;
616
617   } /* end switch statement */
618   
619   return point2d;
620} /* end of dymax_point */
621
622
623function rotate2d(angle, point2d) {
624  /* Rotate the point to correct orientation in XY-plane. */
625
626  var ha, hx, hy; // double
627
628  ha = radians(angle);
629  hx = point2d.x;
630  hy = point2d.y;
631  point2d.x = hx * Math.cos(ha) - hy * Math.sin(ha);
632  point2d.y = hx * Math.sin(ha) + hy * Math.cos(ha);
633  
634  return point2d;
635} /* end rotate procedure */
636
637
638function rotate3d(axis, alpha, point3d) {
639  /* Rotate a 3-D point about the specified axis.         */
640
641  var a = point3d.x;
642  var b = point3d.y;
643  var c = point3d.z;
644  
645  if(axis == 1) {
646    point3d.y = b * Math.cos(alpha) + c * Math.sin(alpha);
647    point3d.z = c * Math.cos(alpha) - b * Math.sin(alpha);
648  }
649
650  if(axis == 2) {
651    point3d.x = a * Math.cos(alpha) - c * Math.sin(alpha);
652    point3d.z = a * Math.sin(alpha) + c * Math.cos(alpha);
653  }
654
655  if(axis == 3) {
656    point3d.x = a * Math.cos(alpha) + b * Math.sin(alpha);
657    point3d.y = b * Math.cos(alpha) - a * Math.sin(alpha);
658  }
659  
660  return point3d;
661} /* end of r2 */
662
663
664init_stuff();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.