Среда программирования:
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 кб |