AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Oberfläche wird nicht vollständig aktualisiert
Thema durchsuchen
Ansicht
Themen-Optionen

Oberfläche wird nicht vollständig aktualisiert

Ein Thema von knaeuel · begonnen am 16. Aug 2010 · letzter Beitrag vom 16. Aug 2010
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz