c
c Simple XYZ Logo
c
c Illustrates transformations of regions.  The entire
c logo is made using only a few commands:
c
c        para  - defines parameters and sets values
c        block - creates a block part
c        dei   - deletes part of the block
c        tr    - transforms certain regions
c            SUBOPTIONS:
c              v - translates region along a vector
c             mx - translates along x axis only
c             my - translates along y axis only
c             mz - translates along z axis only
c           xsca - scales the x-coordinates by a factor
c           ysca - scales the y-coordinates by a factor
c           zsca - scales the z-coordinates by a factor
c             rx - rotates about the x-axis
c             ry - rotates about the y-axis
c             rz - rotates about the z-axis
c
c Notice how linear interpolation of regions is done 
c automatically, greatly simplifying the procedure to
c make such parts.
c
c ************************* X *************************
  para tk 1
       len 1
       thick 1;
  block 
     1 5 9 13;                                c i-list
     1 5 9 13;                                c j-list
     1 5;                                     c k-list
     0 [%len] [%len+%tk] [2*%len+%tk];        c x-list
     0 [%len] [%len+%tk] [2*%len+%tk];        c y-list
     0 %thick;                                c z-list
 disp
c DELETE ENOUGH TO MAKE A "+"
  dei 1 2 0 3 4; 1 2 0 3 4;;
 disp
c ROTATE ENDS OF THE X SO THEY'LL ALLIGN AFTER ROTATIONS
  tr 4 1 0 4 4 0
   v [-2*%len-%tk] [-%len-%tk] 0 c trans. upper corner of right edge to origin
     ysca [sqrt(2)]              c scale to compensate for coming rotation
     rz 45                       c rotate counter-clockwise
   v [2*%len+%tk] [%len+%tk] 0 ; c trans. corner back to its original position
 disp
  tr 1 4 0 4 4 0
   v [-%len-%tk] [-2*%len-%tk] 0 c trans. right corner of upper edge to origin 
     xsca [sqrt(2)]              c scale to keep cross member uniform width
     rz -45                      c rotate clockwise
   v [%len+%tk] [2*%len+%tk] 0 ; c trans. right corner to original position
 disp
  tr 1 1 0 4 1 0
   v [-%len] 0 0                 c trans. left corner of bottom edge to origin
     xsca [sqrt(2)]              c scale to compensate for coming rotation
     rz -45                      c rotate clockwise
   v [%len] 0 0 ;                c put the corner back where it started
 disp
  tr 1 1 0 1 4 0
   v 0 [-%len] 0                 c trans. lower corner of left edge to origin
     ysca [sqrt(2)]              c the usual scaling
     rz 45                       c rotate counter-clockwise
   v 0 [%len] 0 ;                c put the corner back where it started
 disp
c ROTATE THE ENTIRE X TO A STANDARD POSITION
  tr 0 0 0 0 0 0
     v [-%len-0.5*%tk] [-%len-0.5*%tk] 0 c center the object at (0,0,?)
     rz 45;                              c rotate counter-clockwise
 disp
c HEIGHT AND WIDTH OF THE X
  para width     [%tk*sqrt(2)+2*(%len+%tk)/sqrt(2)]
       height    [2*(%len+%tk)/sqrt(2)];
c PUT THE X IN A UNIT BOX WITH LOWER LEFT CORNER AT (0,0,?)
  tr 0 0 0 0 0 0
     v [%width/2] [%height/2] 0
     xsca [1/%width]
     ysca [1/%height];
 disp
c END THE PART
  endpart
c ************************* Y *************************
  para  angle  50      c angle of Y top branches to horizontal
        lwid    2      c lower width
        uwid    2      c upper width
        ilen    2      c inner length of the upper Y legs
        ht      3      c height of Y stem
        angle1 [atan( tan(%angle) - %lwid/(2*%uwid*cos(%angle)) )];
  c adjusts the upper arm length
    para  ilen   [%ilen+%uwid*tan(%angle1)];
c MAKE THE BLOCK
  block 1 5 7 9 13;
  1 5 7 9;
  1 5;
  0 %ilen [%ilen+%lwid/2] [%ilen+%lwid] [2*%ilen+%lwid]
  0 %ht [%ht+%uwid/2] [%ht+%uwid]
  0 %thick;
 disp
c DELETE BLOCKS NOT USED IN THE Y
  dei 1 2 0 4 5; 1 2;;
  dei 2 4; 2 4;;
 disp
c ROTATE ENDS OF THE CROSS-BAR SO THAT, WHEN THE
c CROSS BAR PARTS ARE ROTATED UP, THE ENDS ARE ALLIGNED
  tr 5 1 1 5 4 2
    v [-2*%ilen-%lwid] [-%ht-%uwid] 0
      ysca [1/cos(90-%angle)] rz [90-%angle]
    v [2*%ilen+%lwid] [%ht+%uwid] 0;
 disp
  tr 1 1 1 1 4 2
    v 0 [-%ht-%uwid] 0
      ysca [1/cos(90-%angle)] rz [%angle-90]
    v 0 [%ht+%uwid] 0; 
 disp
  tr 4 2 1 4 4 2
    v [-%ilen-%lwid] [-%ht] 0
      ysca [1/cos(%angle1)] rz [-%angle1]
    v [%ilen+%lwid] [%ht] 0 ; 
 disp
  tr 2 2 1 2 4 2
    v [-%ilen] [-%ht] 0
      ysca [1/cos(%angle1)] rz [%angle1]
    v [%ilen] [%ht] 0 ; 
 disp
c ROTATE THE CROSS BARS TO FORM THE BRANCHES OF THE Y
  tr 4 2 1 5 4 2
    v [-%ilen-%lwid] [-%ht] 0
      rz [%angle]
    v [%ilen+%lwid] [%ht] 0;
 disp
  tr 1 2 1 2 4 2
    v [-%ilen] [-%ht] 0
      rz [-%angle]
    v [%ilen] [%ht] 0 ; 
 disp
c ROTATE PIECES OF THE 3 BARS SO THAT THEY MEET IN THE MIDDLE
  tr 4 2 1 4 3 2
    v [-%ilen-%lwid] [-%ht] 0
      rz [90+%angle1-%angle] xsca [1/cos(%angle-%angle1)]
      rz [-90-%angle1+%angle] rz [%angle-%angle1]
    v [%ilen+%lwid] [%ht] 0;
 disp
  tr 2 2 1 2 3 2
    v [-%ilen] [-%ht] 0
      rz [-90-%angle1+%angle] xsca [1/cos(%angle-%angle1)]
      rz [90+%angle1-%angle] rz [%angle1-%angle]
    v [%ilen] [%ht] 0;
 disp
  tr 2 2 1 3 2 2
    v [-%ilen] [-%ht] 0
      xsca [1/cos(90+2*(%angle1-%angle))] rz [90+2*(%angle1-%angle)]
    v [%ilen] [%ht] 0; 
 disp
c DIMENSIONS OF THE CONTAINING BOX
  para leg    [%ilen+%uwid*tan(90-%angle)]
       width  [2*%leg*cos(%angle)+%lwid]
       height [%ht+%leg*sin(%angle)];
c PUT THE Y IN A UNIT BOX AND TO THE RIGHT OF THE X
  tr 0 0 0 0 0 0
    mx [-%ilen+%leg*cos(%angle)]
    xsca [1/%width]
    ysca [1/%height]
    mx 1;
 disp
c END THE PART  
  endpart
c ************************* Z *************************
para tk    1
     tk1   0.5
     len   2
     ht    2
     angle [atan(%ht/%len)];
block 1 5 7 11;
      1 5 9 13;
      1 5;
      0 [%len] [%len+%tk1] [%len+%tk1+%len];
      0 [%tk] [%tk+%ht] [2*%tk+%ht];
      0 [%thick];
 disp
c GET RID OF STUFF THAT WILL NOT BE PART OF THE Z
  dei 1 2; 1 3;;
  dei 3 4; 2 4;;
 disp
c MOVE THE REGIONS ON THE RIGHT BELOW THE ONES ON THE LEFT
  tr 2 1 1 4 2 2 mx [-%len];
 disp
c ROTATE END REGIONS TO FORM CORNERS ON THE Z
  tr 3 3 1 3 4 2
    v [-%len-%tk1] [-%tk-%ht] 0 
      ysca [1/cos(%angle)] rz [-%angle] 
    v [%len+%tk1] [%tk+%ht] 0;
 disp
  tr 2 1 1 2 2 2
    v 0 [-%tk] 0
      ysca [1/cos(%angle)] rz [-%angle]
    v 0 [%tk] 0;
 disp
c ROTATE INTERIOR REGIONS TO ALLIGN WITH END REGIONS
  tr 3 1 1 3 2 2
    v [-%tk1] [-%tk] 0
      ysca [1/cos(%angle)] rz [-%angle]
    v [%tk1] [%tk] 0;
 disp
  tr 2 3 1 2 4 2
    v [-%len] [-%tk-%ht] 0
      ysca [1/cos(%angle)] rz [-%angle]
    v [%len] [%tk+%ht] 0;
 disp
c ALLIGN BOTTOM AND TOP OF THE Z
  tr 4 1 1 4 4 2 mx [%tk*tan(%angle)];
  tr 1 1 1 1 4 2 mx [-%tk*tan(%angle)];
 disp
c HEIGHT AND WIDTH OF THE Z
  para height [2*%tk+%ht]
       width  [%len+%tk1+2*%tk*tan(%angle)];
c PUT THE Z IN A UNIT BOX TO THE RIGHT OF THE Y
    tr 0 0 0 0 0 0 
      mx [%tk*tan(%angle)]
      xsca [1/%width] ysca [1/%height]
      mx 2;
 disp
c END THE PART
  endpart
c GO TO THE MERGE PHASE AND REMOVE THE COINCIDENT NODES
  merge
  stp 0.01                 c eliminate coincident nodes
  ry 10 rx 10 zf 1.5 tvv   c draw the final model
