Also ich habe deine Vorschläge mal in mein Programm versucht einzubauen. Wegen der X - Y Berechnung : Man kann am Anfang die Anzahl eingeben und die Schritte, deswegen habe ich das so umständlich gelöst. Normalerweise könnte man auch ein Konstante verwenden, ich fand diese Methode besser.
Das einzige wo ich mir nicht sicher bin ist die Skalierung ? Verstehen tu ich es, allerdings weiss ich nicht ob ich es korrekt in Delphi umgesetzt habe. Hier nochmal mein Code:
Delphi-Quellcode:
procedure TfrmFunktionsplotter.btnAusgabeClick(Sender: TObject);
var Anzahl_n : Integer;
i, j, k, l, m : Integer;
Schritt : Double;
Y_Max_Wert : Extended;
X_Max_Wert : Extended;
Y_Min_Wert : Extended;
X_Min_Wert : Extended;
Y_Max_Min : Extended;
X_Max_Min : Extended;
Y_Temp_Max : Extended;
X_Temp_Max : Extended;
Y_Temp_Min : Extended;
X_Temp_Min : Extended;
Y_Null_Punkt : Extended;
X_Null_Punkt : Extended;
Skalierung_Faktor_Y : Extended;
Skalierung_Faktor_X : Extended;
begin
Y_Max_Wert := 0;
Y_Min_Wert := 0;
X_Max_Wert := 0;
X_Min_Wert := 0;
Y_Null_Punkt := 0;
X_Null_Punkt := 0;
Anzahl_n := StrToInt((edtAnzahln.Text));
Schritt := StrToFloat(edtSchritt.Text);
{ Schritt 1 : Wertetabelle erstellen für die Berechnung
X aus den Schritten und Y wird aus Sin(x) errechntet }
for i:= 0 to Anzahl_n do
begin
X_Werte_Array[i+1] := X_Werte_Array[i] + Schritt;
Y_Werte_Array[i+1] := Sin(X_Werte_Array[i]);
memAusgabe.Lines.Add('');
memAusgabe.Lines.Add('Wert von X : ' + FloatToStr(X_Werte_Array[i]));
memAusgabe.Lines.Add('Sin von X : ' + FloatToStr(Y_Werte_Array[i]));
memAusgabe.Lines.Add('');
end;
{ Schritt 2 : Min und Max von Y bestimmen
Max Y kann nicht größer als 1 sein
Min Y kann nicht kleiner als -1 sein
Wenn größer, dann auf eins runden }
// Max Y
for k:= 0 to Anzahl_n do
begin
Y_Temp_Max := Y_Werte_Array[k];
if (Y_Temp_Max > Y_Max_Wert)
then Y_Max_Wert := Y_Temp_Max;
if ( Y_Max_Wert > 1) then
begin
Y_Max_Wert := 1;
break;
end;
end;
// Min Y
for j := 0 to Anzahl_n do
begin
Y_Temp_Min := Y_Werte_Array[j];
if (Y_Temp_Min < Y_Min_Wert)
then Y_Min_Wert := Y_Temp_Min;
if ( Y_Max_Wert < - 1) then
begin
Y_Min_Wert := -1;
break;
end;
end;
// Max X
for l := 0 to Anzahl_n do
begin
X_Temp_Max := X_Werte_Array[l];
if (X_Temp_Max > X_Max_Wert)
then X_Max_Wert := X_Temp_Max;
end;
// Min X
for m := 0 to Anzahl_n do
begin
X_Temp_Min := X_Werte_Array[m];
if (X_Temp_Min < X_Min_Wert)
then X_Min_Wert := X_Temp_Min;
end;
memAusgabe.Lines.Add('');
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('Y Max-Wert : ' + FloatToStr(Y_Max_Wert));
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('Y Min-Wert : ' + FloatToStr(Y_Min_Wert));
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('X Min-Wert : ' + FloatToStr(X_Min_Wert));
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('X Max-Wert : ' + FloatToStr(X_Max_Wert));
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('************************************************');
// Schritt 3 : Nullpunktverschiebung durch Subtraktion des Min - Wertes
if ( Y_Min_Wert < 0) then Y_Null_Punkt := Y_Min_Wert - Y_Min_Wert;
if ( X_Min_Wert < 0) then X_Null_Punkt := X_Min_Wert - X_Min_Wert;
memAusgabe.Lines.Add('');
memAusgabe.Lines.Add('Y - Nullpunkt nach Verschiebung: ' + FloatToStr(Y_Null_Punkt));
memAusgabe.Lines.Add('');
memAusgabe.Lines.Add('X - Nullpunkt nach Verschiebung: ' + FloatToStr(X_Null_Punkt));
memAusgabe.Lines.Add('');
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('************************************************');
// Schritt 4 : Max - Min berechnen
X_Max_Min := X_Max_Wert - X_Min_Wert;
Y_Max_Min := Y_Max_Wert - Y_Min_Wert;
memAusgabe.Lines.Add('');
memAusgabe.Lines.Add('X Max/Min Wert: ' + FloatToStr(X_Max_Min));
memAusgabe.Lines.Add('');
memAusgabe.Lines.Add('Y Max/Min Wert: ' + FloatToStr(Y_Max_Min));
memAusgabe.Lines.Add('');
memAusgabe.Lines.Add('************************************************');
memAusgabe.Lines.Add('************************************************');
// Schritt 5 : h (bzw. b) (Max - Min) errechnen
System_Breite := imSystem.Width;
System_Hoehe := imSystem.Height;
{ Skalierung
Sind mehr Punkte vorhanden als die Größe der Canvas darstellen kann?
Sind weniger Punkte vorhanden als die Größe der Canvas darstellen kann
// 100 Punkte 100 Pixel 1 :1
// 100 Punkte 10 Pixel 10 :1
// 10 Punkte 100 Pixel 1 :10
// Weniger Punkte als Zeichenfläche
// 10 Punkte = 500 Pixel = System_Breite / Anzahl_n; Faktor : 50
// Mehr Punkte als Zeichenfläche
// 500 Punkte = 10 Pixel = System_Breite / Anzahl_n; Faktor : 0.02 }
if (Anzahl_n > System_Breite) or (Anzahl_n < System_Breite)
then Skalierung_Faktor_X := System_Breite / Anzahl_n;
if (Anzahl_n > System_Hoehe) or ( Anzahl_n < System_Hoehe)
then Skalierung_Faktor_Y := (System_Hoehe / Anzahl_n);
end;
Hoffe du kannst mir erneut helfen und sagen was daran falsch ist, falsch was falsch ist. Ansonsten schonmal ein riesen Dankeschön für die Hilfe.