Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.
Спасибо за статью. Я не Ваш студент. Но мне она помогла написать функцию для Канторова множества на Python для черепашки: import turtle def kanter(x, y, d):     if d > 1:         turtle...
Как реализовать в данном примере границы расчёта?

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
Borland Delphi 7.0
Статья по теме: 

Построить фрактал треугольник Серпинского

Самым знаменитым примером площадного геометрического фрактала является треугольник Серпинского , строящийся путем разбиения треугольника, необязательно равностороннего – средними линиями на четыре подобных треугольника, исключением центрального и рекурсивного разбиения угловых треугольников до получения площадных элементов желаемого разрешения.

Преимущество использования рекурсии очевидно - без рекурсии построение такого рисунка состоящего более чем из шести уровней весьма проблематично, а рекурсия позволяет увеличивать количество уровней, не ограничиваясь минимальными размерами самого нижнего уровня. Например, с помощью этой программы можно увеличить количество уровней до пятнадцати при этом будет ощутима только некоторая задержка при выводе изображения на экран, а вот без рекурсии такой рисунок построить будет практически невозможно, так как изображение будет состоять более чем из тридцати одной тысячи треугольников.

Алгоритм построения треугольника Серпинского довольно прост:

1) строится большой внешний треугольник;
2) строится треугольник, получающийся при соединении середин сторон большого треугольника;
3) строятся треугольники, получающиеся аналогичнo.
Изображение состоит из однотипных элементов, связанных между собой зависимостью каждого следующего элемента от координат предыдущего.

Код программы: 

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OpenGL, StdCtrls;
 
type
  line = array[1..3] of Double;
  mas = array[1..2] of line;
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure SetDCPixelFormat (hdc: HDC);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  hrc: HGLRC;
  DC:HDC;
  v:integer;
 
  x2,y2:double;
  x:mas;
implementation
 
{$R *.dfm}
 
procedure TForm1.FormCreate(Sender: TObject);
begin
   Randomize;
   DC:=GetDC(Handle);
   SetDCPixelFormat(DC);
   hrc:= wglCreateContext(DC);
   wglMakeCurrent(DC, hrc);
   x[1,1]:=-0.7;                      // Координаты вершин начального треугольника
   x[1,2]:=0;
   x[1,3]:=0.7;
   x[2,1]:=-0.7;
   x[2,2]:=0.7;
   x[2,3]:=-0.7;
   x2:=-0.7;                         // первая точка в треугольнике для реализации фрактала
   y2:=0.7;
end;
 
procedure TFOrm1.SetDCPixelFormat (hdc: HDC);
 var pfd: TPixelFormatDescriptor; nPixelFormat: Integer;
begin
   FillChar (pfd, SizeOf (pfd), 0);
  nPixelFormat:= ChoosePixelFormat (hdc, @pfd);
  SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
 
procedure TForm1.FormPaint(Sender: TObject); var i:integer;
begin
  x2:=-0.3;
  y2:=0;
  glClearColor(0.0,0.0,0,0);
  glClear (GL_COLOR_BUFFER_BIT);
  glColor3f (1.0, 0, 0);
  glPointSize(1);                  // построение вершин треугольника
  glBegin (GL_POINTS);
    glVertex2f (x[1,1],x[2,1]);
    glVertex2f (x[1,2],x[2,2]);
    glVertex2f (x[1,3],x[2,3]);
  glEnd;
 
for i:=1 to 500000 do        // цикл для постоения 500000 точек фрактала
begin
v:=Random(3)+1;            //  выбор случайной вершины
if v=1 then
 begin
   x2:=(x2+x[1,1])/2;
   y2:=(y2+x[2,1])/2;
 end;
if v=2 then
 begin
   x2:=(x2+x[1,2])/2;
   y2:=(y2+x[2,2])/2;
 end;
if v=3 then
 begin
   x2:=(x2+x[1,3])/2;
   y2:=(y2+x[2,3])/2;
 end;
 glBegin(GL_POINTS);            // отрисовка точек
 glColor(1,1,0.5);
 glVertex2f (x2,y2);
 glEnd;
 end;
 SwapBuffers(DC);
 wglMakeCurrent (0, 0);
end;
 
 
end.

Прикрепленный файлРазмер
Marchenko_Serpinskogo.zip195.87 кб