Среда программирования:
Lazarus
Статья по теме:
Алгоритм работает на основе заданной точки (x,y), которая является центром многоугольника, R - расстоянием от центра до ближайшей стороны и числу k, говорящее о количестве сторон. Смысл алгоритма заключается в том, что мы образно рисуем окружность вокруг центровой точки с радиусом R. И разрезаем её на k частей под углом z:=z+k, где k=360/k.
Код программы:
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; procedure lineAngle(x, y, R, angle :integer); procedure Button1Click(Sender: TObject); private { private declarations } public var x,y,R,k,z,i:integer; var a: array[1..100] of integer; var b: array[1..100] of integer; end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.lineAngle(x, y, R, angle :integer); begin // Round - смещение по кругу; y отрицательный потому что в компьютере он идёт наоборот a[i]:=Round(x+cos(angle/180*pi)*R); b[i]:=Round(y-sin(angle/180*pi)*R); end; procedure TForm1.Button1Click(Sender: TObject); begin x:=210; y:=210; R:=100; // x и y - центр многоугольника k:=8; // k- количество сторон k:=360 div k; i:=0; //Запоминаем все точки. 360+k т.к. пропускаем вначале первую точку. while z<=360+k do begin i:=i+1; // Написал перед, потому что Lazarus почему-то присваивает 360, если после lineAngle(x,y,R,z); z:=z+k; end; // Соединяем все полученные точки while i-2>0 do begin i:=i-1; canvas.line(a[i],b[i],a[i-1],b[i-1]); end; end; end.
Прикрепленный файл | Размер |
---|---|
Исходный код | 2.2 кб |