l4.PAS 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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
  32. I, J: Integer;
  33. X, Y, Lx, Ly: Real;
  34. Ap, Bp, Cp, Dp: Point3D;
  35. BEGIN
  36. SetColor(Colour);
  37. CtrlPt[-1] := CtrlPt[1];
  38. CtrlPt[0] := CtrlPt[1];
  39. CtrlPt[N+1] := CtrlPt[N];
  40. CtrlPt[N+2] := CtrlPt[N];
  41. For I := 0 To N Do Begin
  42. BSpline_ComputeCoeffs(I, Ap, Bp, Cp, Dp);
  43. Spline_Calc(Ap, Bp, Cp, Dp, 0, 8, Lx, Ly);
  44. For J := 1 To Resolution Do Begin
  45. Spline_Calc(Ap, Bp, Cp, Dp, J/Resolution, 8, X, Y);
  46. Line(Round(Lx), Round(Ly), Round(X), Round(Y));
  47. Lx := X; Ly := Y;
  48. End;
  49. End;
  50. END;
  51. {--------------------------------------}
  52. VAR
  53. I, J, Res, NumPts: Integer;
  54. BEGIN
  55. I := Detect;
  56. InitGraph(I, J, '');
  57. NumPts := 5;
  58. Res := 80;
  59. CtrlPt[1].X := 100; CtrlPt[1].Y := 100;
  60. CtrlPt[NumPts].X := 600; CtrlPt[NumPts].Y := 200;
  61. While not Keypressed do begin
  62. Randomize;
  63. ClearDevice;
  64. for j := 2 to NumPts-1 do With CtrlPt[j] do
  65. begin
  66. X := Random(640);
  67. Y := Random(480);
  68. end;
  69. BSpline(NumPts, Res, LightGreen);
  70. for j := 1 to NumPts do Circle(round(Ctrlpt[j].x),round(Ctrlpt[j].y),4);
  71. ReadKey;
  72. End;
  73. CloseGraph;
  74. END.