REM Data for the lines
REM a number 2
REM DATA 10, 45, -45, 0, 40, -50, 0, -40, -50, 0, -40, -30, 0, 30, 30, 0, 30, 50, 0, -40, 50, 0, -40, 30, 0, -1, -1, -1

REM A spiral
DATA 10
DATA -160, 40, 0
DATA -146.666667, 20, 34.6410161
DATA -133.333333, -20, 34.6410162
DATA -120, -40, 4.21140101E-8
DATA -106.666667, -20, -34.6410161
DATA -93.3333333, 19.9999999, -34.6410162
DATA -80, 40, -8.42280201E-8
DATA -66.6666667, 20, 34.6410161
DATA -53.3333333, -19.9999999, 34.6410162
DATA -40, -40, 8.90891272E-8
DATA -26.6666667, -20.0000001, -34.6410161
DATA -13.3333333, 19.9999999, -34.6410162
DATA 0, 40, -1.6845604E-7
DATA 13.3333333, 20.0000002, 34.6410161
DATA 26.6666667, -19.9999999, 34.6410162
DATA 40, -40, 9.88113413E-8
DATA 53.3333333, -20.0000001, -34.6410161
DATA 66.6666667, 19.9999999, -34.6410162
DATA 80, 40, -1.78178254E-7
DATA 93.3333333, 20.0000002, 34.6410161
DATA 106.666667, -19.9999998, 34.6410163
DATA 120, -40, 2.57545167E-7
DATA 133.333333, -20.0000002, -34.641016
DATA 146.666667, 19.9999997, -34.6410163
DATA 160, 40, -3.3691208E-7
DATA -1, -1, -1

DIM Code% &10000
FOR Pass = 8 TO 10 STEP 2
P%=Code%
L%=Code%+&10000

 [ OPT Pass
 DCD Vertices-Code%
 DCD EndVertices-Vertices
 DCD Faces-Code%

  .Vertices
 ]
 RESTORE
 READ td%
 mm = SQR(3)-0.5
 px% = -1: py% = -1: pz% = -1
 ppx% = -1: ppy% = -1: ppz% = -1
 REPEAT
   READ x%, y%, z%
   IF x% <> -1 OR y% <> -1 OR z% <> -1 THEN
     IF px% <> -1 OR py% <> -1 OR pz% <> -1 THEN
       IF ppx% <> -1 OR ppy% <> -1 OR ppz% <> -1 THEN
         ab = SQR((ppx%-px%)*(ppx%-px%)+(ppy%-py%)*(ppy%-py%)+(ppz%-pz%)*(ppz%-pz%))*SQR((x%-px%)*(x%-px%)+(y%-py%)*(y%-py%)+(z%-pz%)*(z%-pz%))
         abcostheta = (ppx%-px%)*(x%-px%) + (ppy%-py%)*(y%-py%) + (ppz%-pz%)*(z%-pz%)
         costheta = abcostheta / ab
         theta = ACS( costheta )
         ax = ppx%-px%: ay = ppy%-py%: az = ppz%-pz%
         lena = SQR( ax*ax+ay*ay+az*az)
         ax = ax/lena: ay = ay/lena: az = az/lena
         bx = x%-px%: by = y%-py%: bz = z%-pz%
         lenb = SQR( bx*bx+by*by+bz*bz)
         bx = bx/lenb: by = by/lenb: bz = bz/lenb
         aplusbx = ax+bx: aplusby = ay+by: aplusbz = az+bz
         lenaplusb = SQR(aplusbx*aplusbx+aplusby*aplusby+aplusbz*aplusbz)
         aplusbx = aplusbx/lenaplusb: aplusby = aplusby/lenaplusb: aplusbz = aplusbz/lenaplusb
         acrossbx = (ppy%-py%)*(z%-pz%) - (ppz%-pz%)*(y%-py%)
         acrossby = (ppz%-pz%)*(x%-px%) - (ppx%-px%)*(z%-pz%)
         acrossbz = (ppx%-px%)*(y%-py%) - (ppy%-py%)*(x%-px%)
         acrossbx = acrossbx/(ab*SIN theta): acrossby = acrossby/(ab*SIN theta): acrossbz = acrossbz/(ab*SIN theta)
         [ OPT Pass
           DCD px% + td%*(aplusbx/2 - acrossbx): DCD py% + td%*(aplusby/2 - acrossby): DCD pz% + td%*(aplusbz/2 - acrossbz)
           DCD px% + td%*(aplusbx/2 + acrossbx): DCD py% + td%*(aplusby/2 + acrossby): DCD pz% + td%*(aplusbz/2 + acrossbz)
           DCD px% - td%*aplusbx*mm: DCD py% - td%*aplusby*mm: DCD pz% - td%*aplusbz*mm
         ]
       ENDIF
     ELSE
       [ OPT Pass
         DCD x% :DCD y% :DCD z%
       ]
     ENDIF
     ppx% = px%: ppy% = py%: ppz% = pz%
     px% = x%: py% = y%: pz% = z%
   ENDIF
 UNTIL x% = -1 AND y% = -1 AND z% = -1
 [ OPT Pass
   DCD px%: DCD py%: DCD pz%

  .EndVertices

  .Faces
 ]
 RESTORE
 READ td%
 mm = SQR(3)-0.5
 ppp% = -1
 pp% = -1
 p% = -1
 v% = 0
 REPEAT
   READ x%, y%, z%
   IF x% <> -1 OR y% <> -1 OR z% <> -1 THEN
     IF p% <> -1 THEN
       IF pp% <> -1 THEN
         IF ppp% <> -1 THEN
           IF (pppx%-ppx%)*(x%-px%) + (pppy%-ppy%)*(y%-py%) + (pppz%-ppz%)*(z%-pz%) >= 0 THEN
             [ OPT Pass
               = &03: = v%+1: = v%+0 : = v%+3
               = &03: = v%+1: = v%+3 : = v%+4
               = &03: = v%+2: = v%+1 : = v%+4
               = &03: = v%+2: = v%+4 : = v%+5
               = &03: = v%+0: = v%+2 : = v%+5
               = &03: = v%+0: = v%+5 : = v%+3
             ]
           ELSE
             [ OPT Pass
               = &03: = v%+1: = v%+0 : = v%+5
               = &03: = v%+1: = v%+5 : = v%+3
               = &03: = v%+2: = v%+1 : = v%+3
               = &03: = v%+2: = v%+3 : = v%+4
               = &03: = v%+0: = v%+2 : = v%+4
               = &03: = v%+0: = v%+4 : = v%+5
             ]
           ENDIF
           v% = v% + 3
         ELSE
           [ OPT Pass
             = &03: = v% : = v%+1 : = v%+2
             = &03: = v% : = v%+2 : = v%+3
             = &03: = v% : = v%+3 : = v%+1
           ]
           v% = v% + 1
         ENDIF
       ENDIF
     ENDIF
     ppp%=pp%:pp%=p%:p%=0
     pppx%=ppx%:pppy%=ppy%:pppz%=ppz%
     ppx%=px%:ppy%=py%:ppz%=pz%
     px%=x%:py%=y%:pz%=z%
   ELSE
     [ OPT Pass
       = &03: = v%+0 : = v%+3 : = v%+1
       = &03: = v%+1 : = v%+3 : = v%+2
       = &03: = v%+2 : = v%+3 : = v%+0
     ]
   ENDIF
 UNTIL x% = -1 AND y% = -1 AND z% = -1
 [ OPT Pass
   = &00
 ]

NEXT Pass

OSCLI("*Save ^.Shapes.Funky "+STR$~Code%+"+"+STR$~(P%-Code%))
OSCLI("*SetType ^.Shapes.Funky Data")

END
