Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
Delphi 2009 Professional
|
Re: Koordinatensystem zeichnen und......
24. Sep 2003, 20: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
|
|
Zitat
|