Einzelnen Beitrag anzeigen

Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Koordinatensystem zeichnen und......

  Alt 24. Sep 2003, 19:23
Hallo,
hier ein bisschen Kommentar
Delphi-Quellcode:
const

  idYFromBottom = 4; // Abstand von der Unterkante der TPaintBox
  idYFromTop = 4; // Abstand von der Oberkante der TPaintBox
  idXFromLeft = 4; // Abstand von der linken Kante der TPaintBox
  idXFromRight = 4; // Abstand von der rechten Kante der TPaintBox
  iTicksCount = 10; // Anzahl er Teilstriche
  iTicksLen = 4; // Länge eines Teilstriches

{$R *.DFM}

{ TForm1 }

procedure TForm1.PaintCoord;
var
  orgX : Integer; // Ursprung X
  orgY : Integer; // Ursprung Y
  iXcnt : Integer; // Zähler
  iYcnt : Integer; // Zähler
  Tick : Integer; // Max Werte der X- oer Y-Achse (für die Beschriftung)
  XAxisLen : Integer; // Länge der X-Achse
  YAxisLen : Integer; // Länge das Y-Achse;
  XPoint : Integer; // X-Koordinate des Punkte, der gezeichnet werden soll
  YPoint : Integer; // Y-Koordinate des Punktes, der gezeichnet werden soll
  TickCount : Integer; // Anzahl der Teilstriche, die gezeichnet wurden
begin
  With PBCoord.Canvas do
    begin
    // Alles löschen
    Brush.Color:=clBtnFace;
    FillRect(PBCoord.ClientRect);

    // Zeichne Koordinatensystem

    // Berechne die Ursprungskoordinaten des Koordinatensystems (das ist er Punkt(0|0) )
      // orgX:=Abstand von der linken Kante + Textbreite des Max-YWertes * 100
        // Max-YWertes * 100 damit genügend Platz für die Nachkommastelle ist
    orgX:=idXFromLeft+TextWidth(IntToStr(spedtMaxY.Value*100));
      // orgY:=Unterkante der PaintBox-Abstand von der Unterkante - Texthöhe des Max-XWertes
    orgY:=PBCoord.ClientHeight-idYFromBottom-TextHeight(IntToStr(spedtMaxX.Value))-iTicksLen;

    // Die Achslängen werden gebraucht, um die Teilstriche zu zeichnen um aus den Punktkoordinaten die
    // Pixelkoordinaten zu berechnen
    YAxisLen:=orgY-idYFromTop; // Berechne Länge der Y-Achse
    XAxisLen:=(PBCoord.ClientWidth-idXFromRight)-orgX; // Berechne Länge der Y-Achse

    // Setze die Stifteigenschaften
    Pen.Width:=1;
    Pen.Color:=clBlack;
    Pen.Style:=psSolid;
    // Zeichne die Linien
    MoveTo(orgX,orgY);
    LineTo(orgX,idYFromTop);
    MoveTo(orgX,orgY);
    LineTo(PBCoord.ClientWidth-idXFromRight,orgY);

    // Zeichne die Teilstriche auf der X-Achse
    Tick:=spedtMaxX.Value; // Tick erhält den Max-XWert
    TickCount:=1;
    For iXcnt:=1 to XAxisLen do // Schleifen beginnt bei 1, weil die Teilstriche für die 0 nicht gezeichnet werden sollen
      If iXcnt mod (XAxisLen div iTicksCount) =0 then // Wenn mod den Rest 0 ergibt soll ein Teilstrich gezeichnet werden
        begin
        MoveTo(orgX+iXcnt,orgY); // Setze Stift
        LineTo(orgX+iXcnt,orgY+iTicksLen); // Zeichne Linie
        // X-Pixelkoordinate für die Achsenbeschriftung
        // orgX+iXcnt-TextWidth(FloatToStr(Tick / iTicksCount * TickCount)) div 2
          // Ursprung+Zähler iXcnt - der halben Textbreite der Teilstrichbeschriftung
          // Mit Tick / iTicksCount * TickCount errechnet sich die Beschriftung des Teilstriches
        TextOut(orgX+iXcnt-TextWidth(FloatToStr(Tick / iTicksCount * TickCount)) div 2,orgY+iTicksLen+1,FloatToStr(Tick / iTicksCount * TickCount));
        Inc(TickCount); // Anzahl der gezeichneten Teilstriche um 1 erhöhen
        end;

    // Beschreibung für Y-Achse siehe X-Achse
    Tick:=spedtMaxY.Value;
    TickCount:=1;
    For iYcnt:=1 to YAxisLen do
      If iYcnt mod (YAxisLen div iTicksCount) =0 then
        begin
        MoveTo(orgX,orgY-iYcnt);
        LineTo(orgX-iTicksLen,orgY-iYcnt);
        TextOut(orgX-iTicksLen-TextWidth(FloatToStr(Tick / iTicksCount * TickCount))-1,orgY-iYcnt-TextHeight(IntToStr(Tick)) div 2,FloatToStr(Tick / iTicksCount * TickCount));
        Inc(TickCount);
        end;
    // Setze Punkt
    // Mit Round(XAxisLen/spedtMaxX.Value)*spedtPointX.Value wir die X-Koordinate des Punktes in Pixelkoordinaten auf der Canvas umgerechnet
    XPoint:=orgX+Round(XAxisLen/spedtMaxX.Value)*spedtPointX.Value;
    // Mit Round(YAxisLen/spedtMaxY.Value)*spedtPointY.Value wir die Y-Koordinate des Punktes in Pixelkoordinaten auf der Canvas umgerechnet
    YPoint:=orgY-Round(YAxisLen/spedtMaxY.Value)*spedtPointY.Value;
    Brush.Color:=clRed;
    Ellipse(XPoint-4,YPoint-4,XPoint+4,YPoint+4);
    end; // With PBCoord.Canvas do
end;
Die Erweiterung auf 4 Quadranten musst Du schon selber machen
  Mit Zitat antworten Zitat