Einzelnen Beitrag anzeigen

Preddy2005

Registriert seit: 27. Nov 2005
Ort: Mettmann
38 Beiträge
 
#6

Re: Hilfe bei Plotter und Umrechnung der Koordinaten

  Alt 5. Feb 2006, 15:19
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.
  Mit Zitat antworten Zitat