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

Вход на сайт

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

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

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

Не получается, емаё
огромное спасибо за подробное объяснение про 3д графику на питоне, в интернете очень мало подобной информации
dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.

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

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