home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / sampler / 03 / bezier / bezier.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-10-29  |  2.2 KB  |  104 lines

  1. UNIT Bezier;
  2.  
  3.    { Functions and procedures for Bezier curves }
  4.  
  5. INTERFACE
  6.  
  7. USES   graph;
  8.  
  9. CONST  maxPoints = 10;    { max control points for a curve }
  10.        segments  = 40;        { nbr of segments in a curve }
  11.  
  12. TYPE   vectorArray = ARRAY [0..maxPoints, 0..2] OF INTEGER;
  13.  
  14. PROCEDURE BezierFcn (VAR x, y, z  : REAL;
  15.                          u        : REAL;
  16.                          n        : INTEGER;
  17.                      VAR p        : vectorArray);
  18. PROCEDURE DrawBezier2D (VAR p     : vectorArray;
  19.                             npts  : INTEGER);
  20. { -------------------------------------------------------- }
  21. IMPLEMENTATION
  22.  
  23. FUNCTION c (n, i : INTEGER) : INTEGER;
  24.  
  25.    { Binomial coefficient used in blending function }
  26.  
  27. VAR   j : INTEGER;
  28.  
  29.   FUNCTION fact (q : INTEGER) : INTEGER;
  30.   VAR    f, c : INTEGER;
  31.   BEGIN        { Compute factorial of q }
  32.     f := 1;
  33.     FOR c := q DOWNTO 2 DO
  34.       f := f * c;
  35.     fact := f;
  36.   END;
  37.  
  38. BEGIN
  39.   C := fact (n) div (fact (i) * fact (n - i));
  40. END;
  41. { --------------------------- }
  42.  
  43. FUNCTION blend (i, n : INTEGER; u : REAL) : REAL;
  44.  
  45.  { Bernstein blending function used in Bezier formulation }
  46.  
  47. VAR   partial : REAL;
  48.       j       : INTEGER;
  49.  
  50. BEGIN
  51.   Partial := c (n, i);
  52.   FOR j := 1 TO i DO
  53.     Partial := partial * u;
  54.   FOR j := 1 TO (n - i) DO
  55.     Partial := partial * (1 - u);
  56.   Blend := partial;
  57. End;
  58. { --------------------------- }
  59.  
  60. PROCEDURE BezierFcn;
  61.  
  62.   { Returns 3D coordinates for current 'u' on the curve }
  63.  
  64. VAR   i : INTEGER;
  65.       b : REAL;
  66.  
  67. BEGIN
  68.   x := 0;
  69.   y := 0;
  70.   z := 0;
  71.   FOR i := 0 TO n DO
  72.   BEGIN
  73.     b := blend (i, n, u);
  74.     x := x + p [i, 0] * b;
  75.     y := y + p [i, 1] * b;
  76.     z := z + p [i, 2] * b;
  77.   END;
  78. END;
  79. { --------------------------- }
  80.  
  81. PROCEDURE drawBezier2D;
  82.  
  83.   { Draws a 2D Bezier curve. Graphics mode assumed. }
  84.  
  85. VAR    i          : INTEGER;
  86.        oldX, oldY,
  87.        u, x, y, z : REAL;
  88.  
  89. BEGIN
  90.   FOR i := 0 TO segments DO
  91.   BEGIN
  92.     u := i / segments;
  93.     BezierFcn (x, y, z, u, npts, p);
  94.     IF i = 0 THEN
  95.       MoveTo (ROUND (x), ROUND (y))
  96.     ELSE
  97.       LineTo (ROUND (x), ROUND (y));
  98.   END;
  99. END;
  100. { --------------------------- }
  101.  
  102. END.
  103.  
  104.