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

Вход на сайт

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

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

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

Не работает, выводит это: Process terminated with status 4258096 (0 minute(s), 2 second(s)) при этом открывается консоль с тем же числом
А как можно добавить сюда глубину рекурсии, то есть сложность линии?
ошибка : пишет не удается открыть источник файл "SDL.h" Из за этой ошибки не удается запустить программу хотя я все сделал правильно , в результате код не работает : //подключим SDL и stdio #include #include //Некоторые константы нашего окна const...
Чет не работает, помогите, надо очень сильно

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

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

Демонстрация триангуляции многоугольника.
Рисуем многоугольник, разделяем его на треугольники.
Для запуска программы достаточно запустить файл .exe.

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

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

unit Trianguliation;
 
interface
 
uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls;
 
type
    TForm1 = class(TForm)
        PaintBox1: TPaintBox;
        procedure PaintBox1Click(Sender: TObject);
        function V(p1, p2, p3: TPoint): Integer;
    end;
 
var
    Form1: TForm1;
    Brush: TBrush;
    a: Array [0..11] of TPoint; 
    used: Array [0..30] of Integer; 
    b: Array [0..30] of Array [0..2] of Tpoint;
    i, j, k, m, n, cnt, ok: Integer;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.PaintBox1Click(Sender: TObject);
begin
    with PaintBox1.Canvas do begin
 
        a[0] := Point(100, 400); 
        a[1] := Point(100, 100);
        a[2] := Point(200, 600);
        a[3] := Point(300, 400);
        a[4] := Point(200, 300);
        a[5] := Point(500, 300);
        a[6] := Point(300, 500);
        a[7] := Point(600, 500);
        a[8] := Point(600, 0);
        a[9] := Point(400, 100);
        a[10] := Point(0, 0);
 
        Polygon(a); 
 
        for i := 0 to 30 do     
            used[i] := 0;
        cnt := 11; n := 0;
        i := 0; j := 1; k := 2;
 
        while(cnt > 3) do begin    
            cnt := 0; ok := 0;
            if(V(a[i], a[j], a[k]) < 0) then begin   
                ok := 1;
                for m := 0 to 10 do begin           
                    if(used[m] = 0) and
                    (((V(a[i], a[j], a[m]) > 0) and (V(a[j], a[k], a[m]) > 0) and (V(a[k], a[i], a[m]) > 0)) or
                    ((V(a[i], a[j], a[m]) < 0) and (V(a[j], a[k], a[m]) < 0) and (V(a[k], a[i], a[m]) < 0))) then
                        ok := 0;
                end;
            end;
 
            if(ok = 1) then begin
 
                b[n][0] := a[i];
                b[n][1] := a[j];
                b[n][2] := a[k];
                n := n + 1;
                used[j] := 1;
                j := k;
 
                                for m := k + 1 to 21 do
                    if(used[m mod 11] = 0) then begin
                        k := m mod 11;
                        break;
                    end;
 
                for m := 0 to 10 do
                  if(used[m] = 0) then
                      cnt := cnt + 1;
            end
            else begin
                for m := i + 1 to 21 do
                    if(used[m mod 11] = 0) then begin
                        i := m mod 11;
                        break;
                    end;
                for m := j + 1 to 21 do
                    if(used[m mod 11] = 0) then begin
                        j := m mod 11;
                        break;
                    end;
                for m := k + 1 to 21 do
                  if(used[m mod 11] = 0) then begin
                    k := m mod 11;
                    break;
                  end;
            end;
            if(cnt = 0) then cnt := 4;
        end;
 
        i := 0;
 
        for m := 0 to 10 do
            if(used[m] = 0) then begin
            b[n][i] := a[m];
            i := i + 1;
          end;
        for i := 0 to n do begin   
            Brush.Color := RGB(Random(50000) mod 256, Random(50000) mod 256, Random(50000) mod 256);
            Polygon(b[i]);
        end;
    end;
end;
 
function TForm1.V(p1, p2, p3: TPoint): Integer;
begin
    Result := (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);
end;
 
end.

Прикрепленный файлРазмер
Исходный код и исполняемый файл159.81 кб