home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsv / ch4_5 / ellihelp.c next >
Encoding:
C/C++ Source or Header  |  1994-11-22  |  7.0 KB  |  244 lines

  1. /* ellipsoid_par_help.c */
  2.  
  3. #include "ellipsoid.h"
  4.  
  5. #define SetP(p,px,py,pz) (p).x=(px), (p).y=(py), (p).z=(pz)
  6. #define SetV(v,px,py,pz,nx,ny,nz) SetP((v)->p,px,py,pz), SetP((v)->n,nx,ny,nz)
  7. #define SetF(f,i0,i1,i2) (f)->v0 = i0, (f)->v1 = i1, (f)->v2 = i2
  8.  
  9. void ellipsoid_par_help (int n, int nv, int nf, vertex *ev, face *ef, vertex *octant)
  10. {
  11.    int i, j, vv, ww, vv0, ww0;
  12.    vertex *v, *o;
  13.    face *f;
  14.  
  15.    /* Generate vertices and triangular faces of the ellipsoid.   */
  16.    /* Note that each of the 18 statements below (par_0 ~ par_17) */
  17.    /*    are independent of each other.                          */
  18.  
  19. #pragma parallel
  20. #pragma local(i,j,v,o,f,vv,ww,vv0,ww0)
  21. #pragma byvalue(n,nv,nf,ev,ef,octant)
  22. /** #pragma distinct(*v,*ev) **/
  23. /** #pragma distinct(*o,*octant) **/
  24. /** #pragma distinct(*f,*ef) **/
  25. /* parallel */ {
  26. #pragma independent
  27.    /* par_0 */ { /* the north pole */
  28.       v = ev, o = octant;
  29.             SetV (v,  o->p.x,  o->p.y,  o->p.z,  o->n.x,  o->n.y,  o->n.z);
  30.       ;
  31.    }
  32. #pragma independent
  33.    /* par_1 */ { /* vertices on the 1st octant */
  34.       v = ev+1, o = octant+1;
  35.       for (i = 1;;) {
  36.          for (j = i; --j >= 0; o++, v++)
  37.             SetV (v,  o->p.x,  o->p.y,  o->p.z,  o->n.x,  o->n.y,  o->n.z);
  38.          if (i == n) break;
  39.          v += 3*i, i++, o++;
  40.       }
  41.       ; /* This empty statement is necessary because of the compiler-bug(?). */
  42.    }
  43. #pragma independent
  44.    /* par_2 */ { /* vertices on the 2nd octant */
  45.       v = ev+2, o = octant+2;
  46.       for (i = 1;;) {
  47.          for (j = i; --j >= 0; o--, v++)
  48.             SetV (v, -o->p.x,  o->p.y,  o->p.z, -o->n.x,  o->n.y,  o->n.z);
  49.          if (i == n) break;
  50.          v += 3*i+1, i++, o += 2*i;
  51.       }
  52.       ;
  53.    }
  54. #pragma independent
  55.    /* par_3 */ { /* vertices on the 3rd octant */
  56.       v = ev+3, o = octant+1;
  57.       for (i = 1;;) {
  58.          for (j = i; --j >= 0; o++, v++)
  59.             SetV (v, -o->p.x, -o->p.y,  o->p.z, -o->n.x, -o->n.y,  o->n.z);
  60.          if (i == n) break;
  61.          v += 3*i+2, i++, o++;
  62.       }
  63.       ;
  64.    }
  65. #pragma independent
  66.    /* par_4 */ { /* vertices on the 4th octant */
  67.       v = ev+4, o = octant+2;
  68.       for (i = 1;;) {
  69.          for (j = i; --j >= 0; o--, v++)
  70.             SetV (v,  o->p.x, -o->p.y,  o->p.z,  o->n.x, -o->n.y,  o->n.z);
  71.          if (i == n) break;
  72.          i++, v += 3*i, o += 2*i;
  73.       }
  74.       ;
  75.    }
  76. #pragma independent
  77.    /* par_5 */ { /* vertices on the 5th octant */
  78.       v = ev+nv-5, o = octant+1;
  79.       for (i = 1;;) {
  80.          for (j = i; --j >= 0; o++, v++)
  81.             SetV (v,  o->p.x,  o->p.y, -o->p.z,  o->n.x,  o->n.y, -o->n.z);
  82.          if (i == n) break;
  83.          v -= 5*i+4, i++, o++;
  84.       }
  85.       ;
  86.    }
  87. #pragma independent
  88.    /* par_6 */ { /* vertices on the 6th octant */
  89.       v = ev+nv-4, o = octant+2;
  90.       for (i = 1;;) {
  91.          for (j = i; --j >= 0; o--, v++)
  92.             SetV (v, -o->p.x,  o->p.y, -o->p.z, -o->n.x,  o->n.y, -o->n.z);
  93.          if (i == n) break;
  94.          v -= 5*i+3, i++, o += 2*i;
  95.       }
  96.       ;
  97.    }
  98. #pragma independent
  99.    /* par_7 */ { /* vertices on the 7th octant */
  100.       v = ev+nv-3, o = octant+1;
  101.       for (i = 1;;) {
  102.          for (j = i; --j >= 0; o++, v++)
  103.             SetV (v, -o->p.x, -o->p.y, -o->p.z, -o->n.x, -o->n.y, -o->n.z);
  104.          if (i == n) break;
  105.          v -= 5*i+2, i++, o++;
  106.       }
  107.       ;
  108.    }
  109. #pragma independent
  110.    /* par_8 */ { /* vertices on the 8th octant */
  111.       v = ev+nv-2, o = octant+2;
  112.       for (i = 1;;) {
  113.          for (j = i; --j >= 0; o--, v++)
  114.             SetV (v,  o->p.x, -o->p.y, -o->p.z,  o->n.x, -o->n.y, -o->n.z);
  115.          if (i == n) break;
  116.          v -= 5*i+1, i++, o += 2*i;
  117.       }
  118.       ;
  119.    }
  120. #pragma independent
  121.    /* par_9 */ { /* the south pole */
  122.       v = ev+nv-1, o = octant;
  123.             SetV (v, -o->p.x, -o->p.y, -o->p.z, -o->n.x, -o->n.y, -o->n.z);
  124.       ;
  125.    }
  126. #pragma independent
  127.    /* par_10 */ { /* faces on the 1st octant */
  128.       f = ef; vv = 0, ww = 1;
  129.       for (i = 1;;) {
  130.          for (j = i;;) {
  131.             SetF (f, vv, ww, ++ww), f++;
  132.             if (--j == 0) break;
  133.             SetF (f, vv, ww, ++vv), f++;
  134.          }
  135.          if (i == n) break;
  136.          f += 6*i-3; vv = ww-i; ww += 3*i; i++;
  137.       }
  138.       ;
  139.    }
  140. #pragma independent
  141.    /* par_11 */ { /* faces on the 2nd octant */
  142.       f = ef+1; vv = 0, ww = 2;
  143.       for (i = 1;;) {
  144.          for (j = i;;) {
  145.             SetF (f, vv, ww, ++ww), f++;
  146.             if (--j == 0) break;
  147.             SetF (f, vv, ww, ++vv), f++;
  148.          }
  149.          if (i == n) break;
  150.          f += 6*i-1; vv = ww-i; ww += 3*i+1; i++;
  151.       }
  152.       ;
  153.    }
  154. #pragma independent
  155.    /* par_12 */ { /* faces on the 3rd octant */
  156.       f = ef+2; vv = 0, ww = 3;
  157.       for (i = 1;;) {
  158.          for (j = i;;) {
  159.             SetF (f, vv, ww, ++ww), f++;
  160.             if (--j == 0) break;
  161.             SetF (f, vv, ww, ++vv), f++;
  162.          }
  163.          if (i == n) break;
  164.          f += 6*i+1; vv = ww-i; ww += 3*i+2; i++;
  165.       }
  166.       ;
  167.    }
  168. #pragma independent
  169.    /* par_13 */ { /* faces on the 4th octant */
  170.       f = ef+3; vv = 0, ww = 4, vv0 = 0, ww0 = 1;
  171.       for (i = 1;;) {
  172.          for (j = i;;) {
  173.             if (--j == 0) { SetF (f, vv0, ww, ww0), vv++, ww++, f++; break; }
  174.             SetF (f, vv, ww, ++ww), f++;
  175.             if (j == 1) SetF (f, vv, ww, vv0), f++;
  176.             else SetF (f, vv, ww, ++vv), f++;
  177.          }
  178.          if (i == n) break;
  179.          vv0 = ww0; ww0 += 4*i;
  180.          f += 6*i+3; vv = ww-i; i++; ww += 3*i;
  181.       }
  182.       ;
  183.    }
  184. #pragma independent
  185.    /* par_14 */ { /* faces on the 5th octant */
  186.       f = ef+nf-4; vv = nv-5, ww = nv-1;
  187.       for (i = 1;;) {
  188.          for (j = i;;) {
  189.             SetF (f, vv, ww, ++vv), f++;
  190.             if (--j == 0) break;
  191.             SetF (f, vv, ww, ++ww), f++;
  192.          }
  193.          if (i == n) break;
  194.          f -= 10*i+3; ww = vv-i; i++; vv -= 5*i-1;
  195.       }
  196.       ;
  197.    }
  198. #pragma independent
  199.    /* par_15 */ { /* faces on the 6th octant */
  200.       f = ef+nf-3; vv = nv-4, ww = nv-1;
  201.       for (i = 1;;) {
  202.          for (j = i;;) {
  203.             SetF (f, vv, ww, ++vv), f++;
  204.             if (--j == 0) break;
  205.             SetF (f, vv, ww, ++ww), f++;
  206.          }
  207.          if (i == n) break;
  208.          f -= 10*i+1; ww = vv-i; i++; vv -= 5*i-2;
  209.       }
  210.       ;
  211.    }
  212. #pragma independent
  213.    /* par_16 */ { /* faces on the 7th octant */
  214.       f = ef+nf-2; vv = nv-3, ww = nv-1;
  215.       for (i = 1;;) {
  216.          for (j = i;;) {
  217.             SetF (f, vv, ww, ++vv), f++;
  218.             if (--j == 0) break;
  219.             SetF (f, vv, ww, ++ww), f++;
  220.          }
  221.          if (i == n) break;
  222.          f -= 10*i-1; ww = vv-i; i++; vv -= 5*i-3;
  223.       }
  224.       ;
  225.    }
  226. #pragma independent
  227.    /* par_17 */ { /* faces on the 8th octant */
  228.       f = ef+nf-1; vv = nv-2, ww = nv-1, vv0 = nv-5, ww0 = nv-1;
  229.       for (i = 1;;) {
  230.          for (j = i;;) {
  231.             if (--j == 0) { SetF (f, vv, ww0, vv0), vv++, ww++, f++; break; }
  232.             SetF (f, vv, ww, ++vv), f++;
  233.             if (j == 1) SetF (f, vv, ww, ww0), f++;
  234.             else SetF (f, vv, ww, ++ww), f++;
  235.          }
  236.          if (i == n) break;
  237.          f -= 10*i-3; ww = vv-i; i++; vv -= 5*i-4;
  238.          ww0 = vv0; vv0 -= 4*i;
  239.       }
  240.       ;
  241.    }
  242. /* parallel */ }
  243. }
  244.