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.