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

Вход на сайт

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

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

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

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

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

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