Hi @ all!
Ich hab mir ma den Ansatz vom Baron vorgenommen, weil ich das Prinzip nich schlecht finde.
Funktioniert bisher alles. Ich berechne die Funktionsgleichungen aus den gezeichneten Linien und speichere Sie in einem Record ab. Zum anschließenden Zeichnen berechne ich die Schnittpunkte der Linien mit dem Kreis (relativ ungenau). Um herauszufinden, ob drei Linien ein Dreieck bilden, mach ich das so, wies alzaimer gesagt hat.
Jetzt hab ich folgendes Problem:
http://www.xdestiny.de.vu/linien1.jpg
Wie man in dem Screenshot sieht, werden auch Figuren gefüllt, die keine Dreiecke sind, da eine Linie anderer Farbe dadurch geht. Wie kann ich herausfinden, ob eine andersfarbende Linie das Dreieck schneidet.
Delphi-Quellcode:
type
TPointsArray = array[1..2] of TPoint;
PPlayer = ^TPlayer;
TPlayer = record
Name: String;
Color: TColor;
Points: Integer;
end;
TLinie = record
Punkt: TPoint;
n: Real;
m: String;
Player: PPlayer;
end;
var
anfP,endP:TPoint;
Sp1, Sp2: TPlayer; // Spieler
ActivePlayer: PPlayer; // Pointer auf Spieler, der am Zug ist
Linien: array of TLinie; // Array mit allen vorhandenen Linieen
function TForm1.SchnPkt(Linie1,Linie2:TLinie):TPoint;
var m1,m2,x,y:Real;
begin
if (Linie1.m <> 'n') and (Linie2.m <> 'n') and (Linie1.m <> Linie2.m) then
begin
m1 := StrToFloat(Linie1.m);
m2 := StrToFloat(Linie2.m);
x := (Linie2.n-Linie1.n)/(m1-m2);
if (x > 0) and (Ceil((m1*x)+Linie1.n) > 0) and (x < IM_SpielF.Width) and (Ceil((m1*x)+Linie1.n) < IM_SpielF.Height) then
begin
Result.X := Ceil(x);
Result.Y := Ceil((m1*x)+Linie1.n);
end
else
Result := Point(0,0);
end;
end;
procedure TForm1.Triangles;
var
i,j,k : Integer;
AP1,AP2,AP3: TPoint;
begin
if (Length(Linien) >= 3) then
begin
for i:=0 to Length(Linien)-1 do
for j:=i+1 to Length(Linien)-1 do
for k:=j+1 to Length(Linien)-1 do
begin
IM_SpielF.Canvas.Pen.Color := clBlack;
IM_SpielF.Canvas.Brush.Color := clBtnFace;
AP1 := SchnPkt(Linien[i],Linien[j]);
AP1.Y := Convert(AP1.Y);
AP2 := SchnPkt(Linien[i],Linien[k]);
AP2.Y := Convert(AP2.Y);
AP3 := SchnPkt(Linien[k],Linien[j]);
AP3.Y := Convert(AP3.Y);
if Inside(AP1) and Inside(AP2) and Inside(AP3) then
begin
if (Linien[i].Player^.Name = Linien[j].Player^.Name) and (Linien[i].Player^.Name = Linien[k].Player^.Name) then
begin
IM_SpielF.Canvas.Brush.Color := Linien[i].Player^.Color;
IM_SpielF.Canvas.Polygon([AP1,AP2,AP3]);
end;
IM_SpielF.Canvas.Brush.Color := clRed;
IM_SpielF.Canvas.Ellipse(AP1.X-2,AP1.Y-2,AP1.X+2,AP1.Y+2);
IM_SpielF.Canvas.Ellipse(AP2.X-2,AP2.Y-2,AP2.X+2,AP2.Y+2);
IM_SpielF.Canvas.Ellipse(AP3.X-2,AP3.Y-2,AP3.X+2,AP3.Y+2);
end;
end;
end;
end;
Ich hoffe ihr versteht mein Problem und könnt mir helfen...
Thx ... xDestiny