SPLINES.PAS 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. USES Graph,CRT;
  2. CONST
  3. Size = 40;
  4. TYPE
  5. Point3D = Record
  6. X,Y : Real;
  7. End;
  8. VAR CtrlPt: Array [-1..80] Of Point3D;
  9. {--------------------------------------}
  10. PROCEDURE Spline_Calc (Ap, Bp, Cp, Dp: Point3D; T, D: Real; Var X, Y: Real);
  11. VAR T2, T3: Real;
  12. BEGIN
  13. T2 := T * T; { Square of t }
  14. T3 := T2 * T; { Cube of t }
  15. X := ((Ap.X*T3) + (Bp.X*T2) + (Cp.X*T) + Dp.X)/D; { Calc x value }
  16. Y := ((Ap.Y*T3) + (Bp.Y*T2) + (Cp.Y*T) + Dp.Y)/D; { Calc y value }
  17. END;
  18. PROCEDURE BSpline_ComputeCoeffs (N: Integer; Var Ap, Bp, Cp, Dp: Point3D);
  19. BEGIN
  20. Ap.X := -CtrlPt[N-1].X + 3*CtrlPt[N].X - 3*CtrlPt[N+1].X + CtrlPt[N+2].X;
  21. Bp.X := 3*CtrlPt[N-1].X - 6*CtrlPt[N].X + 3*CtrlPt[N+1].X;
  22. Cp.X := -3*CtrlPt[N-1].X + 3*CtrlPt[N+1].X;
  23. Dp.X := CtrlPt[N-1].X + 4*CtrlPt[N].X + CtrlPt[N+1].X;
  24. Ap.Y := -CtrlPt[N-1].Y + 3*CtrlPt[N].Y - 3*CtrlPt[N+1].Y + CtrlPt[N+2].Y;
  25. Bp.Y := 3*CtrlPt[N-1].Y - 6*CtrlPt[N].Y + 3*CtrlPt[N+1].Y;
  26. Cp.Y := -3*CtrlPt[N-1].Y + 3*CtrlPt[N+1].Y;
  27. Dp.Y := CtrlPt[N-1].Y + 4*CtrlPt[N].Y + CtrlPt[N+1].Y;
  28. END;
  29. {--------------------------------------}
  30. PROCEDURE BSpline (N, Resolution, Colour: Integer);
  31. VAR I, J: Integer; X, Y, Lx, Ly: Real; Ap, Bp, Cp, Dp: Point3D;
  32. BEGIN
  33. SetColor(Colour);
  34. CtrlPt[-1] := CtrlPt[1];
  35. CtrlPt[0] := CtrlPt[1];
  36. CtrlPt[N+1] := CtrlPt[N];
  37. CtrlPt[N+2] := CtrlPt[N];
  38. For I := 0 To N Do Begin
  39. BSpline_ComputeCoeffs(I, Ap, Bp, Cp, Dp);
  40. Spline_Calc(Ap, Bp, Cp, Dp, 0, 8, Lx, Ly);
  41. For J := 1 To Resolution Do Begin
  42. Spline_Calc(Ap, Bp, Cp, Dp, J/Resolution, 8, X, Y);
  43. Line(Round(Lx), Round(Ly), Round(X), Round(Y));
  44. Lx := X; Ly := Y;
  45. End;
  46. End;
  47. END;
  48. {--------------------------------------}
  49. VAR I, J, Res, NumPts: Integer;
  50. BEGIN
  51. I := Detect;
  52. InitGraph(I, J, '');
  53. I := GetMaxX; J := GetMaxY;
  54. While not Keypressed do begin
  55. Randomize;
  56. ClearDevice;
  57. CtrlPt[1].X := 1; CtrlPt[1].Y := 1;
  58. CtrlPt[2].X := Random(I); CtrlPt[2].Y := Random(j);
  59. CtrlPt[3].X := Random(I); CtrlPt[3].Y := Random(j);
  60. CtrlPt[5].X := Random(I); CtrlPt[5].Y := Random(j);
  61. CtrlPt[4].X := 640; CtrlPt[4].Y := 3;
  62. Res := 70;
  63. NumPts := 5;
  64. BSpline(NumPts, Res, LightGreen);
  65. ReadKey;
  66. End;
  67. CloseGraph;
  68. END.