Advertisement
Guest User

Untitled

a guest
May 12th, 2013
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 2.53 KB | None | 0 0
  1. Uses Graph, Math;
  2. Type TPoint = Record
  3.                X, Y: Integer;
  4.               End;
  5.  
  6. Type TPolygon = Array of TPoint;
  7.  
  8. // Point
  9. Function Point(const X, Y: Integer): TPoint;
  10. Begin
  11.  Result.X := X;
  12.  Result.Y := Y;
  13. End;
  14.  
  15. // draw_polygon
  16. Procedure draw_polygon(const Poly: TPolygon);
  17. Var L, H, I: Integer;
  18. Begin
  19.  L := Low(Poly);
  20.  H := High(Poly);
  21.  
  22.  Line(Poly[L].X, Poly[L].Y, Poly[H].X, Poly[H].Y);
  23.  For I := L To H-1 Do
  24.   Line(Poly[I].X, Poly[I].Y, Poly[I+1].X, Poly[I+1].Y);
  25.  
  26.  For I := L To H Do
  27.   Circle(Poly[I].X, Poly[I].Y, 5);
  28. End;
  29.  
  30. // insert_point
  31. Procedure insert_point(var Poly: TPolygon; const Point: TPoint; const Pos: Integer);
  32. Var I: Integer;
  33. Begin
  34.  SetLength(Poly, Length(Poly)+1);
  35.  For I := High(Poly) Downto Pos+1 Do
  36.   Poly[I] := Poly[I-1];
  37.  
  38.  Poly[Pos] := Point;
  39. End;
  40.  
  41. // polygon_smooth
  42. Function polygon_smooth(const Poly: TPolygon): TPolygon;
  43.  
  44.   // getDistance
  45.   Function getDistance(const A, B: TPoint): Integer; inline;
  46.   Begin
  47.    Exit(Round(sqrt(sqr(A.X-B.X) + sqr(A.Y-B.Y))));
  48.   End;
  49.  
  50. // main block
  51. Var OutPoly     : TPolygon;
  52.     I, NewPoints: Integer;
  53.  
  54.     P1, P2, P3, P4: TPoint;
  55. Begin
  56.  SetLength(OutPoly, Length(Poly));
  57.  For I := Low(OutPoly) To High(OutPoly) Do
  58.  Begin
  59.   OutPoly[I].X := Poly[I].X;
  60.   OutPoly[I].Y := Poly[I].Y;
  61.  End;
  62.  
  63.  NewPoints := 1;
  64.  I         := 0;
  65.  Repeat
  66.   P1 := Poly[I];
  67.   P2 := Poly[(I+1) mod Length(Poly)];
  68.   insert_point(OutPoly, Point(
  69.                               (P1.X+P2.X) div 2,
  70.                               (P1.Y+P2.Y) div 2
  71.                              ), I+NewPoints);
  72.   Inc(NewPoints);
  73.   Inc(I);
  74.  Until (I > High(Poly));
  75.  
  76.  I := 1;
  77.  Repeat
  78.   P1   := OutPoly[I];
  79.   P2   := OutPoly[(I+1) mod Length(OutPoly)];
  80.   P3   := OutPoly[(I+2) mod Length(OutPoly)];
  81.   P4.X := (P1.X+P3.X) div 2;
  82.   P4.Y := (P1.Y+P3.Y) div 2;
  83.   P4.X := (P4.X+P2.X) div 2;
  84.   P4.Y := (P4.Y+P2.Y) div 2;
  85.  
  86.   With OutPoly[(I+1) mod Length(OutPoly)] do
  87.   Begin
  88.    X := P4.X;
  89.    Y := P4.Y;
  90.   End;
  91.  
  92.   Inc(I, 2);
  93.  Until (I > High(OutPoly));
  94.  
  95.  Exit(OutPoly);
  96. End;
  97.  
  98. Var GD, GM: Smallint;
  99.     Poly  : TPolygon;
  100. Begin
  101.  GD := 0;
  102.  GM := 0;
  103.  InitGraph(GD, GM, '2D polygon smooth');
  104.  
  105.  SetLength(Poly, 3);
  106.  Poly[0] := Point(100, 600);
  107.  Poly[1] := Point(600, 100);
  108.  Poly[2] := Point(1100, 600);
  109.  
  110.  SetColor(White);
  111.  draw_polygon(Poly);
  112.  
  113.  Poly := polygon_smooth(Poly);
  114.  SetColor(Red);
  115.  draw_polygon(Poly);
  116.  
  117.  Poly := polygon_smooth(Poly);
  118.  SetColor(Green);
  119.  draw_polygon(Poly);
  120.  
  121.  Poly := polygon_smooth(Poly);
  122.  SetColor(Blue);
  123.  draw_polygon(Poly);
  124.  
  125.  Readln;
  126. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement