Witam,

Mam problem ze stworzeniem aplikacji wykonującej triangulację Delaunaya - mianowicie mam problem z wyrysowaniem odpowiednich trójkątów. Wklejam cały kod, aczkolwiek problem dotyczy kilku ostatnich linijek.

Kod:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Shape1: TShape;
    procedure Button1Click(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  obrazek:tbitmap;
  i,l:integer;
  a,b,s:string;
  f:textfile;
  pozycja:integer;
  p,q,r:double;
  T:array of array of integer;
  TT:array of array of integer;
  j,m,n,k,c:integer;
  x:Boolean;
begin
i:=0;
setlength(T,200,2);
setlength(TT,2000,7);
assignfile(f,'c:/projekt/dane.txt');
reset(f);
while not (i=200) do
begin
readln(f,s);
pozycja:=pos(';',s);
a:=Copy(s,1,pozycja-1);
b:=Copy(s,pozycja+1,99999);
T[i,0]:=strtoint(a);
T[i,1]:=strtoint(b);
Memo1.Lines.Add(floattostr(T[i,0])+';'+floattostr(T[i,1]));
i:=i+1;
end;
 closefile(f);

for i:=0 to 199 do
begin
if T[i,0]<0 then
begin
T[i,0]:=-T[i,0];
end
else
T[i,0]:=T[i,0];
end;

for i:=0 to 199 do
begin
if T[i,1]<0 then
begin
T[i,1]:=-T[i,1];
end
else
T[i,1]:=T[i,1];
end;


m:=T[0,0];
n:=T[0,1];
for i:=0 to 198 do
begin
if (T[i,0]>T[i+1,0]) and (T[i,0]>m) then
begin
m:=T[i,0];
end
else
begin
m:=m
end;
end;

for i:=0 to 198 do
begin
if (T[i,1]>T[i+1,1]) and (T[i,1]>n) then
begin
n:=T[i,1];
end
else
begin
n:=n;
end;
end;

if n>m then
begin
j:=n;
end
else
begin
j:=m;
end;

TT[0,0]:=3*j+200;
TT[0,1]:=0+200;
TT[0,2]:=0+200;
TT[0,3]:=3*j+200;
TT[0,4]:=-3*j+200;
TT[0,5]:=-3*j+200;


shape1.Canvas.MoveTo(3*j+200,0+200);
shape1.canvas.lineto(0+200,3*j+200);
shape1.canvas.lineto(-3*j+200,-3*j+200);
shape1.canvas.lineto(3*j+200,0+200);

for l:=1 to 198 do
begin
for i:=1 to 198 do
begin
if T[i-1,0]>T[i,0]   then
begin
k:=T[i-1,0];
T[i-1,0]:=T[i,0];
T[i,0]:=k;
end;
end;
end;

//moje testy
for i:=1 to 198 do
begin
Form1.Memo2.Lines.Add(inttostr(T[i,0]));
end;

p:=0;
q:=0;
r:=0;
l:=1;
for i:=0 to 200 do
begin
for j:=0 to 200 do
begin
p:=(((TT[j,3]-TT[j,1])*(T[i,0]+200))/(TT[j,2]-TT[j,0]))+TT[j,1]-(TT[j,0]*(TT[j,3]-TT[j,1]))/(TT[j,2]-TT[j,0])-(T[i,1]+200);
q:=(((TT[j,5]-TT[j,3])*(T[i,0]+200))/(TT[j,4]-TT[j,2]))+TT[j,3]-(TT[j,2]*(TT[j,5]-TT[j,3]))/(TT[j,4]-TT[j,2])-(T[i,1]+200);
r:=(((TT[j,1]-TT[j,5])*(T[i,0]+200))/(TT[j,0]-TT[j,4]))+TT[j,5]-(TT[j,4]*(TT[j,1]-TT[j,5]))/(TT[j,0]-TT[j,4])-(T[i,1]+200);

if (p>0) and (q>0) and (r<0) then
begin
shape1.Canvas.MoveTo(T[i,0]+200,T[i,1]+200);
shape1.canvas.lineto(TT[i,0],TT[i,1]);
shape1.Canvas.MoveTo(T[i,0]+200,T[i,1]+200);
shape1.canvas.lineto(TT[i,2],TT[i,3]);
shape1.Canvas.MoveTo(T[i,0]+200,T[i,1]+200);
shape1.canvas.lineto(TT[i,4],TT[i,5]);


TT[l,0]:=T[i,0];
TT[l,1]:=T[i,1];
TT[l,2]:=TT[i,0];
TT[l,3]:=TT[i,1];
TT[l,4]:=TT[i,2];
TT[l,5]:=TT[i,3];

TT[l+1,0]:=T[i,0];
TT[l+1,1]:=T[i,1];
TT[l+1,2]:=TT[i,0];
TT[l+1,3]:=TT[i,1];
TT[l+1,4]:=TT[i,4];
TT[l+1,5]:=TT[i,5];

TT[l+2,0]:=T[i,0];
TT[l+2,1]:=T[i,1];
TT[l+2,2]:=TT[i,2];
TT[l+2,3]:=TT[i,3];
TT[l+2,4]:=TT[i,4];
TT[l+2,5]:=TT[i,5];

l:=l+3;
end;
if p=0 then
begin
shape1.Canvas.MoveTo(T[i,0]+200,T[i,1]+200);
shape1.canvas.lineto(TT[i,4],TT[i,5]);
end;

if q=0 then
begin
shape1.Canvas.MoveTo(T[i,0]+200,T[i,1]+200);
shape1.canvas.lineto(TT[i,0],TT[i,1]);
end;

if r=0 then
begin
shape1.Canvas.MoveTo(T[i,0]+200,T[i,1]+200);
shape1.canvas.lineto(TT[i,2],TT[i,3]);
end;
end;
end;
end;

end.
Niestety, program nie rysuje odpowiednio tych trójkątów.

Proszę o pomoc.

Pozdrawiam,

Bad Shadow