Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ändern der x-Werte in einem Koordinatensystem (https://www.delphipraxis.net/13345-aendern-der-x-werte-einem-koordinatensystem.html)

eve 16. Dez 2003 16:31


Ändern der x-Werte in einem Koordinatensystem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich möchte ein Programm schreiben, das Funktionen 5.Grades einliest und den Graph in einem Koordinatensystem darstellt. Es soll außerdem möglich sein, nur einen bestimmten Teil des Graphen zu betrachten (durch Eingeben der betrachteten x- und y-Werte). Die Darstellung der Funktion in einem Koordinatensystem hab ich bereits umgesetzt, jedoch nur für x-Werte von -10 bis 10 und für die gleichen y-Werte. Ich hab aber keine Ahnung, wie ich den andren Teil umsetzen soll. Die Suche im Forum hat mir auch nicht weiter geholfen. Für einige Ratschläge wär ich dankbar.

choose 16. Dez 2003 16:44

Re: Ändern der x-Werte in einem Koordinatensystem
 
Hallo eve,

das hatte ich ganz übersehen: Herzlich Willkommen bei der Delphi-PRAXiS!

Ich habe mir Deinen Code noch nicht angesehen (habe hier keinen TotalCommander...), gehe aber davon aus, dass dort irgendwo etwas in der Art
Delphi-Quellcode:
for x:= -10 to 10 do
  PlotDot(x, GetValueOf(x));
steht.

Um die gesamte Zeichenfläche Auszunutzen könntest Du etwas in dieser Art:
Delphi-Quellcode:
for xPos:= 0 to Pred(myCanvas.Width) do
verwenden, wobei Du die Koordinaten des Bildschirms entsprechend umrechnen könntest, um "wirkliche" Koordinaten zu erhalten:
Delphi-Quellcode:
x:= (XOffset+XPos)*XFactor;
Das Ergebnis der Berechnung (GetValueOf(...)) muss anschließend wieder zurückprojiziert werden
Delphi-Quellcode:
yPos:= GetValueOf(x)/YFactor-YOffset;
um den Punkt bei (xPos, yPos) zu zeichnen...

Mathematisch: Du benötigst eine lineare Abbildung zur Projektion von Punkten des Anzeigebereichs auf das Ursprungsbild und deren Umkehrfunktion.

Edit: Willkommensgruß :oops:

eve 16. Dez 2003 17:04

Re: Ändern der x-Werte in einem Koordinatensystem
 
Die Umwandlung in wirkliche Koordinaten funktioniert bereits:
Delphi-Quellcode:
pixelh:=paintbox.Height/(maxy-miny); // pixelh = Pixel pro Hoeheneinheit
pixelw:=paintbox.Width/(maxx-minx); // pixelw = Pixel pro Hoeheneinheit
MoveTo(-2,0);
for spalte:=-1 to paintbox.Width-1 do begin
 x:=minx+spalte/pixelw;
 y:=a*x*x*x*x*x+b*x*x*x*x+c*x*x*x+d*x*x+e*x+f;
 reihe :=paintbox.height-trunc(y*pixelh-miny*pixelh);
 LineTo(spalte,reihe);
end;
(Diese Verfahren hab ich aus einem andren Thread übernommen)

Nun wird der Graph zwar immer korrekt dargestellt, aber im Verhältnis zu den x- und y-Achsen stimmt es dann doch wieder net. Am besten mal das Programm ausführen, einen Graph mit den vorgegebenen Werten zeichnen lassen und anschließend den Darstellungsbereich der x- bzw. y-Achse ändern. Dann wird vielleich klarer was ich mein.

choose 16. Dez 2003 18:33

Re: Ändern der x-Werte in einem Koordinatensystem
 
Mir fällt auf, dass der KoordinatenUrsprung sowie die bisher gezeichneten Funktionen nicht an den neu gewählten Ausschnitt angepasst werden...
Du solltest das Zeichnen des Urspungs ebenfalls über die Projektion laufen lassen. Es böte sich darüber hinaus an, die Berechnung der Projektion in eine Funktion der Art
Delphi-Quellcode:
function PaintboxToCoords(const APoint: TPoint): TCoord;
bzw
Delphi-Quellcode:
function CoordsToPaintbox(const ACoord: TCoord): TPoint
mit
Delphi-Quellcode:
type
  TCoord = record
    X, Y: Double;
  end;

function Coord(const AX, AY: Double): TCoord;
begin
  Result.X:= AX;
  Result.Y:= AY;
end;
wg der Übersichtlichkeit auszulagern.

Das mit den bisherigen Funktionen bei Veränderung des Ausschnitts wird schwierig. Weil Du die Zeichenfläche löschen musst, wäre es notwendig die Koeffizieten als 6-Tupel in einer geeigneten Struktur (zB dynamisches Array) abzulegen und die Zeichenroutine anschließend für jedes Element des Arrays erneut durchzuführen...

eve 16. Dez 2003 19:38

Re: Ändern der x-Werte in einem Koordinatensystem
 
hmm, das mit den beiden Funktionen versteh ich irgendwie net.
Über das Problem mit der bisherigen Funktion bei Änderung der x- bzw. y-Werte muss man sich auch keine Gedanken machen, das brauch ich eigentlich net. Hab es jetzt ma so gemacht, dass bei Änderung dieser Werte die Zeichenfläche gelöscht wird. Außerdem hab ich den Code nochma allgemein bissl übersichtlicher gemacht, hoffe man versteht es jetzt besser.

Zitat:

Zitat von choose
Mir fällt auf, dass der KoordinatenUrsprung sowie die bisher gezeichneten Funktionen nicht an den neu gewählten Ausschnitt angepasst werden...

Genau das ist eigentlich mein Problem, ich weiss nicht, wie ich das umsetzen kann.


Und noch ne kleine Frage: Wie kann ich die Schriftgröße einer textout Ausgabe einstellen?

choose 16. Dez 2003 20:03

Re: Ändern der x-Werte in einem Koordinatensystem
 
Zitat:

Zitat von eve
hmm, das mit den beiden Funktionen versteh ich irgendwie net.

mein Vorschlag sollte in etwa bedeuten, dass es übersichtlicher ist, die Logik zum Projizieren der Koordinaten von der Darstellung (dem Malen) zu Trennen. Dann wird auch die Umkehrfunktion übersichtlicher, die Du für das Koordinatensystem benötigst.

Zitat:

Zitat von eve
Zitat:

Zitat von choose
Mir fällt auf, dass der KoordinatenUrsprung sowie die bisher gezeichneten Funktionen nicht an den neu gewählten Ausschnitt angepasst werden...

Genau das ist eigentlich mein Problem, ich weiss nicht, wie ich das umsetzen kann.

Angenommen, Du hast die besagte Umkehrfunktion, sollte dieser Pseudocode das Problem lösen
  1. Berechne die Bildschirmkoordinaten (x0, y0) der Koordinaten (0,0) des Bildraums (den Koordinaten in denen Deine Funktion "existiert")
  2. Zeichne die X-Achse auf der Zeichenfläche von (0, y0) nach (Width-1, y0)
  3. Zeichne die Y-Achse auf der Zeichenfläche von (x0, 0) nach (x0, Height-1)

Zitat:

Zitat von eve
Wie kann ich die Schriftgröße einer textout Ausgabe einstellen?

Sieh mal in der Delphi Online-Hilfe (OH) unter TCanvas.Font nach.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz