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.
Proszę o pomoc.
Pozdrawiam,
Bad Shadow
Zakładki