Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Кривая Гильберта


unit gilbert_;

interface

uses
  Windows, Messages, SysUtils,
  Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ComCtrls;

type
  TForml = class(TForm)
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

var
  p: integer = 5; // порядок кривой
  u: integer = 7; // длина штриха

{ Кривую Гильберта можно получить путем
соединения элементов а,b,с и d.

Каждый элемент строит
соответствующая процедура. }

procedure a(i: integer; canvas: TCanvas); forward;
procedure b(i: integer; canvas: TCanvas); forward;
procedure с(i: integer; canvas: TCanvas); forward;
procedure d(i: integer; canvas: TCanvas); forward;

// Элементы кривой
procedure a(i: integer; canvas: TCanvas);
begin
  if i > 0 then
  begin
    d(i - l, canvas);
    canvas.LineTo(canvas.PenPos.X + u, canvas.PenPos.Y);
    a(i - l, canvas);
    canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y + u);
    a(i - l, canvas);
    canvas.LineTo(canvas.PenPos.X - u, canvas.PenPos.Y);
    с(i - 1, canvas);
  end;
end;

procedure b(i: integer; canvas: TCanvas);
begin
  if i > 0 then
  begin
    c(i - l, canvas);
    canvas.LineTo(canvas.PenPos.X - u, canvas.PenPos.Y);
    b(i - 1, canvas);
    canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y - u);
    b(i - l, canvas);
    canvas.LineTo(canvas.PenPos.X + u, canvas.PenPos.Y);
    d(i - l, canvas);
  end;
end;

procedure c(i: integer; canvas: TCanvas);
begin
  if i > 0 then
  begin
    b(i - 1, canvas);
    canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y - u);
    с(i - 1, canvas);
    canvas.LineTo(canvas.PenPos.X - u, canvas.PenPos.Y);
    c(i - 1, canvas);
    canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y + u);
    a(i - 1, canvas);
  end;
end;

procedure d(i: integer; canvas: TCanvas);
begin
  if i > 0 then
  begin
    a(i - 1, canvas);
    canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y + u);
    d(i - 1, canvas);
    canvas.LineTo(canvas.PenPos.X + u, canvas.PenPos.Y);
    d(i - 1, canvas);
    canvas.LineTo(canvas.PenPos.X, canvas.PenPos.Y - u);
    b(i - 1, canvas);
  end;
end;

procedure TForml.FormPaint(Sender: TObject);
begin
  Form1.Canvas.MoveTo(u, u);
  a(5, Form1.Canvas); // вычертить кривую Гильберта
end;

end.

Следует обратить внимание на следующую особенность реализации программы. Процедура, которая вычерчивает элемент а, помимо самой себя (для вычерчивания элемента а кривой более низкого порядка) вызывает процедуры d и ь, описание (текст) которых в тексте программы находится после процедуры а. Чтобы компилятор не вывел сообщение об ошибке, в текст программы помещено объявление процедуры с ключевым словом forward, означающим, что это только объявление, а описание (реализация) находится дальше. Таким образом, уже в процессе компиляции процедуры а, компилятор "знает", что имена ь и d означают процедуры.

Проект Delphi World © Выпуск 2002 - 2004
Автор проекта: ___Nikolay