
Построение вложенных спиральных квадратов. На форме находится кнопка, по нажатию на которую, сначала рассчитываются координаты, начиная с правой нижней точки, двигаясь по часовой стрелке, заканчивая верхней правой точкой. Координаты первой точки рассчитываются по формуле:
x = x0 + c * cos(b + 1*pi/4)
y = y0 + c * sin(b + 1*pi/4)
Координаты трёх следующих точек рассчитываются по этой же формуле, только при расчете каждой следующей координаты мы прибавляем и умножаем 2 ко второму слагаемому в скобке. Т.е. вторая точка будет иметь координаты:
x = x0 + c * cos(b + 3*pi/4)
y = y0 + c * sin(b + 3*pi/4)
И так далее, вплоть до 4 точки.
Переменная "c" рассчитывается по формуле:c:=x*sin(pi/3), для каждого следующего квадрата эта переменная получается путем умножения ее предыдущего значения на sin(pi/3). Переменная х была найдена экспериментальным путем.
Переменная "b" рассчитывается по формуле: b := pi/19, для каждого следующего квадрата эта переменная получается путем сложения ее предыдущего значения с sin(pi/19).
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons, ExtCtrls; type { TForm1 } TForm1 = class(TForm) BitBtn1: TBitBtn; PaintBox1: TPaintBox; procedure BitBtn1Click(Sender: TObject); procedure Square(c, b: Real); private { private declarations } public { public declarations } end; var Form1: TForm1; i : Integer;//Переменная используемая в цикле, обозначает кол-во проходов l,a : Real;//Переменные используемые для построения каждого квадрата const d0 = 283;{Константа, влияющая на расстояние от центра квадрата до углов(Не диагональ), подобрана экспериментальным путем } //Координаты центра квадрата x0 = 200; y0 = 200; implementation {$R *.lfm} { TForm1 } procedure TForm1.Square(c, b: Real); //функция построения и отрисовки квадрата var x1, y1,x2,y2,x3,y3,x4,y4: Integer; begin x1 := Round(x0 + c * cos(b + pi/4)); y1 := Round(y0 + c * sin(b + pi/4)); //Координаты правой нижней точки x2 := Round(x0 + c * cos(b + 3*pi/4)); y2 := Round(y0 + c * sin(b + 3*pi/4)); //Координаты левой нижней точки x3 := Round(x0 + c * cos(b + 5*pi/4)); y3 := Round(y0 + c * sin(b + 5*pi/4)); //Координаты левой верхней точки x4 := Round(x0 + c * cos(b + 7*pi/4)); y4 := Round(y0 + c * sin(b + 7*pi/4)); //Координаты правой верхней точки //Метод строящий фигуру по 4 точкам PaintBox1.Canvas.Polygon([Point(x1,y1),Point(x2,y2), Point(x3,y3),Point(x4,y4)]); end; procedure TForm1.BitBtn1Click(Sender: TObject);{Функция построения квадратов с заданными параметрами по нажатию кнопки } begin l := d0; a := 0; for i:=1 to 30 do //Цикл, рисующий 30 квадратов begin Square(l, a); //Вызов функции построения и отрисовки квадрата a := a + pi/19;//изменяет угол поворота следующих квадратов l:=l*sin(pi/3);//изменяет размер следующих квадратов end; end; end.
Прикрепленный файл | Размер |
---|---|
Spir_Kvadrat.zip | 638.24 кб |