Registriert seit: 2. Jul 2007
110 Beiträge
Delphi 10.3 Rio
|
AW: Oberfläche wird nicht vollständig aktualisiert
16. Aug 2010, 14:07
hier die Paint-Methode. Leider ist sie etwas länger. Kurz zusammengefasst malt sie die Akteure auf einem großem gedachten Kreis und zeichnet anschließend Verbindungslinien, wenn welche definiert wurden.
Code:
procedure TSozioImage.Paint();
var ai:integer;
a,b,c:real;
act_color:TColor;
bi,wert:integer;
ckurz,akurz,bkurz,steigung,xziel,yziel:real;
begin
//zuerst:
inherited;
//alle Akteure einzeichnen
Picture.Bitmap.Canvas.Pen.Color:=initial_pen_color;
Picture.Bitmap.Canvas.Brush.Color:=clWhite;//initial_brush_color;
for ai := 0 to anzahl_akteure-1 do
begin
act_color:=akteur[ai].color;
Picture.Bitmap.Canvas.Pen.Color:=act_color;
KreisZeichnen(akteur[ai].x,akteur[ai].y,akteur[ai].radius,true,act_color);
Picture.Bitmap.Canvas.Font.Color:=act_color;
Picture.Bitmap.Canvas.TextOut(wc.vx2x(akteur[ai].bx),wc.vy2y(akteur[ai].by),akteur[ai].akteur);
end;
//alle Verbindungen einzeichnen
for ai:=0 to length(akteur)-1 do
begin
Picture.Bitmap.Canvas.Pen.Color:=akteur[ai].color;
for bi:=0 to length(akteur[ai].output)-1 do
begin
if ai<>bi then //Beziehung zu sich selbst überspringen
begin
//eine Beziehung einlesen
wert:=StrToInt(akteur[ai].output[bi]);
//zeichnen
if wert>0 then
begin
Picture.Bitmap.Canvas.MoveTo(wc.vx2x(akteur[ai].x),wc.vy2y(akteur[ai].y));
//Endpunkt der Linie berechnen:
//die Linie soll bereits bei Erreichen des Kreises des Ziels enden
//und eine Pfeilspitze erhalten
//1. Länge der Verbindungsgeraden bestimmen (Hypotenuse c)
a:=(akteur[bi].x-akteur[ai].x);
b:=(akteur[bi].y-akteur[ai].y);
c:=sqrt(a*a+b*b);
//c um den Radius des Ziel"kreises" verkürzen
ckurz:=c-akteur[bi].radius;
//2. neues verkürztes Steigungsdreieck berechnen
//Steigung der Hypotenuse ist konstant
steigung:=b/a;
//neues a: a²+(a*steigung)²=c²
akurz:=sqrt(ckurz*ckurz/(steigung*steigung+1));
//neues b: a²+b²=c²
bkurz:=sqrt(ckurz*ckurz-akurz*akurz);
//3. Koordinaten bestimmen
//a>=0: nach oben zeichnen
//a<0: nach unten zeichnen
if a>=0 then
xziel:=akteur[ai].x+akurz
else
xziel:=akteur[ai].x-akurz;
//b>=0: nach rechts zeichnen
//b<0: nach links zeichnen
if b>=0 then
yziel:=akteur[ai].y+bkurz
else
yziel:=akteur[ai].y-bkurz;
Picture.Bitmap.Canvas.LineTo(wc.vx2x(xziel),wc.vy2y(yziel));
end;
end;
end;
end;
//am Ende
// inherited;
end;
Wolfgang
Geändert von knaeuel (16. Aug 2010 um 14:32 Uhr)
|
|
Zitat
|