Конспект урока "Рисование правильных многоугольников в Lazarus"


Для того чтобы построить правильный многоугольник, необходимо сначала разобраться из чего
он состоит. Правильный многоугольник состоит из одинаковых отрезков и равных углов.
Следовательно, необходимо знать длину стороны и угол между сторонами. Длину стороны можно
задать любую, так как она будет влиять только на размер многоугольника. А вот угол будет
меняться для каждого многоугольника. Чтобы вычислить угол необходимо воспользоваться
формулой: (180*(n-2))/n. В этой формуле n это количество углов. Тем самым меняя переменную
n можно получить множество многоугольников.
Программирование начнем с создания интерфейса программы. Вот самый простой вариант:
На форме размещено:
Button1: TButton; \\ кнопка для рисования многоугольников
Edit1: TEdit; \\ содержит количество углов
Edit2: TEdit; \\ содержит длину стороны
Image1: TImage; \\ объект на котором будем рисовать
Label1: TLabel; \\ метка для описания интерфейса
Label2: TLabel; \\ метка для описания интерфейса
Теперь необходимо разобраться, как же рисовать сами многоугольники.
Вначале необходимо нарисовать прямую линию нужного размера, это будет основа
многоугольника. Затем нужно нарисовать линию того же размера но повернутую на угол
вычисленный по формуле (180*(n-2))/n.
Для того чтобы повернуть линию будем использовать формулу:
x := Round(x + dim* cos(u));
y := Round(y - dim* sin(u));
Тут главная переменная u, которая содержит угол поворота линии.
Вот код который строит линию, повернутую на угол u:
form1.Image1.Canvas.Line(x, y, Round(x + dim * cos(u)), Round(y - dim * sin(u)));
x,y начало линии.
Dim длинна линии.
Если взять u=(108*(n-2))/n то при программировании не чего не получиться, так как в Lazarus углы
откладываются от одной и той же линии, которая является нулем.
Если построить две линии для u=0 и для u=(108*(n-2))/n, то получим:
Горизонтальная линия построенна при угле в нуль градусов. И вторая построенна при угле
0+(108*(n-2))/n
А нам необходим вот этот угол:
Этот угол найти нетрудно он равен 180-(108*(n-2))/n.
Теперь можно переходить к программированию. Вначале необходимо задать начальные
значения переменных:
x:=300; \\ координата x начала многоугольника
y:=600; \\ координата y начала многоугольника
count:=strtoint(edit1.Text); \\ количество углов многоугольника
dim:=strtoint(edit2.Text); \\ длинна стороны многоугольника
p:=pi-((pi*(count-2))/count); \\ вычисление угла в многоугольнике
u:=0; \\ значение угла для первой линии многоугольника
Далее необходимо задать цикл который будет строить линии постоянно поворачивая их на угол
180-(108*(n-2))/n, но так как нужно строить не от нуля мы будем прибавлять к старому углу новое
значение.
Получим выражение
U:=u+p;
Так как p:= 180-(108*(n-2))/n,
Остается лишь построить линию с такими координатами. Вот весь код обработчика событий для
кнопки:
procedure TForm1.Button1Click(Sender: TObject);
var
i,dim,count,x,y:integer;
u,p:real;
begin
Image1.Canvas.Brush.Color:=clwhite;
Image1.Canvas.Pen.Color:=clblue;
Image1.Canvas.Pen.Width:=5;
Image1.Canvas.FillRect(0,0,form1.Width,form1.Height);
x:=300;
y:=600;
count:=strtoint(edit1.Text);
dim:=strtoint(edit2.Text);
p:=pi-((pi*(count-2))/count);
u:=0;
for i:=1 to count do
begin
form1.Image1.Canvas.Line(x, y, Round(x + dim * cos(u)), Round(y - dim * sin(u)));\\ строим линию
x := Round(x + dim* cos(u));\\вычисляем новые координаты
y := Round(y - dim* sin(u)); \\вычисляем новые координаты
u:=u+p; \\ получаем новый угол
end;
end;
Окно рабочей программы: