Einzelnen Beitrag anzeigen

knaeuel

Registriert seit: 2. Jul 2007
110 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Oberfläche wird nicht vollständig aktualisiert

  Alt 16. Aug 2010, 13: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 13:32 Uhr)
  Mit Zitat antworten Zitat