home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / new / misc / sci / splines / bspline.c < prev    next >
C/C++ Source or Header  |  1994-09-16  |  4KB  |  178 lines

  1. /* The routines in this file are copyright (c) 1987 by Helene (Lee) Taran.
  2.  * Permission is granted for use and free distribution as long as the
  3.  * original author's name is included with the code.
  4.  */
  5.  
  6. /*
  7.  * Reformatted, and modified to compile without warnings and errors
  8.  * under SAS/C -6.5x by gduncan@philips.oz.au (GMD). This included
  9.  * proto generation, renaming of some literals to avoid name collisions,
  10.  * and Amiga Version string (also displayed in Title bar).
  11.  * No original version number, this version arbitrarily named 1.1. 
  12.  * - otherwise no functional changes.
  13.  * GMD - Sep 94
  14.  */
  15.  
  16. #include "all.h"
  17.  
  18.  
  19. /* Draw_Natural_Bspline : draws the bspline with natural ends that
  20.  * is defined by the list of <control_points>. Assumes that there
  21.  * are at least three control points.
  22.  */
  23.  
  24. void
  25. Draw_Natural_Bspline (w, control_points)
  26.      WINDOW *w;
  27.      DLISTPTR control_points;
  28.  
  29. {
  30.   REAL_POINT t1, t2, t3, t4, first, last;
  31.   DLISTPTR a = FIRST (control_points);
  32.   DLISTPTR b = NEXT (a);
  33.   DLISTPTR c = NEXT (b);
  34.  
  35.   first = *POINT (a);
  36.   TickMark (&t1, 1, 3, POINT (a), POINT (b));
  37.   TickMark (&t2, 2, 3, POINT (a), POINT (b));
  38.   if (DrawAFrame)
  39.     DrawConstructionLine (w, POINT (a), POINT (b));
  40.   while (1)
  41.     {
  42.       if (b == LAST (control_points))
  43.     {
  44.       DrawBezierArc (w, &first, &t1, &t2, POINT (b));
  45.       return;
  46.     }
  47.       TickMark (&t3, 1, 3, POINT (b), POINT (c));
  48.       TickMark (&t4, 2, 3, POINT (b), POINT (c));
  49.       TickMark (&last, 1, 2, &t2, &t3);
  50.       if (DrawAFrame)
  51.     {
  52.       DrawConstructionLine (w, POINT (b), POINT (c));
  53.       DrawConstructionLine (w, &t2, &t3);
  54.     }
  55.       DrawBezierArc (w, &last, &t2, &t1, &first);
  56.       first = last;
  57.       t1 = t3;
  58.       t2 = t4;
  59.       a = b;
  60.       b = c;
  61.       c = NEXT (c);
  62.     }
  63. }
  64.  
  65. /* Draw_TripleKnot_Bspline : draws the bspline with triple knots at the ends
  66.  * defined by the list of <control_points>. Assumes that there
  67.  * are at least four control points.
  68.  */
  69.  
  70. void
  71. Draw_TripleKnot_Bspline (w, control_points)
  72.      WINDOW *w;
  73.      DLISTPTR control_points;
  74. {
  75.   REAL_POINT t1, t2, t3, t4, first, last;
  76.   DLISTPTR a = FIRST (control_points);
  77.   DLISTPTR b = NEXT (a);
  78.   DLISTPTR c = NEXT (b);
  79.   DLISTPTR d = NEXT (c);
  80.  
  81.   if (DrawAFrame)
  82.     DrawConstructionLine (w, POINT (a), POINT (b));
  83.  
  84.   first = *POINT (a);
  85.   t1 = *POINT (b);
  86.   if (LENGTH (control_points) == 4)
  87.     t2 = *POINT (c);
  88.   else
  89.     TickMark (&t2, 1, 2, POINT (b), POINT (c));
  90.  
  91.   while (1)
  92.     {
  93.  
  94.       if (d == LAST (control_points))
  95.     {            /* draw the last arc */
  96.       if (DrawAFrame)
  97.         {
  98.           DrawConstructionLine (w, POINT (b), POINT (c));
  99.           DrawConstructionLine (w, POINT (c), POINT (d));
  100.         }
  101.       DrawBezierArc (w, &first, &t1, &t2, POINT (d));
  102.       return;
  103.     }
  104.  
  105.       if (d == PREVIOUS (LAST (control_points)))
  106.     {
  107.       TickMark (&t3, 1, 2, POINT (c), POINT (d));
  108.       t4 = *POINT (d);
  109.     }
  110.       else
  111.     {
  112.       TickMark (&t3, 1, 3, POINT (c), POINT (d));
  113.       TickMark (&t4, 2, 3, POINT (c), POINT (d));
  114.     }
  115.  
  116.       TickMark (&last, 1, 2, &t2, &t3);
  117.       if (DrawAFrame)
  118.     {
  119.       DrawConstructionLine (w, POINT (b), POINT (c));
  120.       DrawConstructionLine (w, &t2, &t3);
  121.     }
  122.       DrawBezierArc (w, &last, &t2, &t1, &first);
  123.       first = last;
  124.       t1 = t3;
  125.       t2 = t4;
  126.       a = b;
  127.       b = c;
  128.       c = d;
  129.       d = NEXT (d);
  130.     }
  131. }
  132.  
  133.  
  134.  
  135. /* Draw_Closed_Bspline : draws the closed bspline that
  136.  * is defined by the list of <control_points>. Assumes that there
  137.  * are at least three control points. 
  138.  */
  139.  
  140. void
  141. Draw_Closed_Bspline (w, control_points)
  142.      WINDOW *w;
  143.      DLISTPTR control_points;
  144. {
  145.   REAL_POINT t1, t2, t3, t4, first, last;
  146.   DLISTPTR a = FIRST (control_points);
  147.   DLISTPTR b = NEXT (a);
  148.   DLISTPTR c = NEXT (b);
  149.  
  150.   TickMark (&t1, 2, 3, POINT (LAST (control_points)), POINT (a));
  151.   TickMark (&t2, 1, 3, POINT (a), POINT (b));
  152.   TickMark (&first, 1, 2, &t1, &t2);
  153.   if (DrawAFrame)
  154.     DrawConstructionLine (w, POINT (a), POINT (b));
  155.   do
  156.     {
  157.       if (b == LAST (control_points))
  158.     c = FIRST (control_points);
  159.       TickMark (&t3, 2, 3, POINT (a), POINT (b));
  160.       TickMark (&t4, 1, 3, POINT (b), POINT (c));
  161.       TickMark (&last, 1, 2, &t3, &t4);
  162.       if (DrawAFrame)
  163.     {
  164.       DrawConstructionLine (w, POINT (b), POINT (c));
  165.       DrawConstructionLine (w, &t3, &t4);
  166.     }
  167.       DrawBezierArc (w, &first, &t2, &t3, &last);
  168.       first = last;
  169.       t1 = t3;
  170.       t2 = t4;
  171.       a = b;
  172.       b = c;
  173.       c = NEXT (c);
  174.     }
  175.   while (a != FIRST (control_points));
  176. }
  177. /*--*/
  178.