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

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

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

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

У меня проблема вот с этим: gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);. Вылезает ошибка: CS1061 "object" не содержит определения "GL_COLOR_BUFFER_BIT", и не удалось найти доступный метод расширения "GL_COLOR_BUFFER_BIT",...
Большое спасибо. Единственный код который прошел без каких либо ошибок. Ура!!!
Скажите пожалуйста, подскажите алгоритм по которому по заданным точкам можно определить тип многогранника, скажем это куб или прямоугольный параллелепипед. Нашел теорию по этим фигурам: https://www.mat... https://www.mat... Акцентировать внимание...
Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё

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

Рейтинг@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 кб