Robert E. Lee: Applet zoomen

Hallo,

ich habe ein Applet für quadratische Iterationen und gebe dieses als eine Grafik in einem Koordinatensystem wieder. Da die geraden bei 300 Iterationen jedoch sehr nah aneinander liegen würde ich gerne zoomen.
Ich habe bis lang aber immer nur Quellcode zum zoomen von Bildern (jpg, etc.) gefunden.

Hoffe jemand von euch kann mir helfen.

Da dies meine erste Java-Arbeit ist weiß ich nicht ob ihr hierfür noch Informationen benötigt. Also bitte einfach Bescheid geben dann.

Vielen Dank schon mal
Mühle

  1. hallo,

    Da die geraden bei 300 Iterationen jedoch sehr nah aneinander liegen würde ich gerne zoomen.

    Ich habe für eine vergleichbare Sache folgendes im Einsatz:

      
    public boolean mouseDown(java.awt.Event evt, int xm, int ym) {  
        int zoom = 2;  
        double xn = x0+xm/(double)breite*(x1-x0);  
        double yn = y0+ym/(double)hoehe*(y1-y0);  
        double xw = x1-x0;  
        double yw = y1-y0;  
        xw /= zoom*2;  
        yw /= zoom*2;  
        x0 = xn-xw;  
        x1 = xn+xw;  
        y0 = yn-yw;  
        y1 = yn+yw;  
        max = (int)(max * 1.25);  
        thread = new Thread(this);  
        thread.start();  
        return true;  
      }  
    
    

    Die Zoomfunktion ist hier an das Ereignis "Maustaste wird gedrückt" gekoppelt.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
    1. Sieht gut aus nur bekomme ich es nicht zum Laufen. Beim erstellen der class gibt mir javac immer Fehler aus.

      Quelltext:

      import java.awt.*;
      import java.applet.Applet;

      public class quadratischeIteration extends Applet
      {
         // Deklaration und Initialiserung

      private static final long serialVersionUID = 1L;
         final int breite = 500, hoehe = 500;                 // Zeichenfläche
         final int vertikalerUrsprung = 490,horizontalerUrsprung = 10;   // Position des Ursprungs
         double pixelProEinheit = 450;                       // Pixel pro Einheit
         double a = 1.8;               // Faktor a der Gleichung
         int horizontalerPunkt = 0, vertikalerPunkt = 0;      // Koordinaten des neuen Punktes
         int horizontalerPunktAlt = 0, vertikalerPunktAlt = 0;     // Koordinaten des letzten Punkte
         double horizontalerGleitpunkt = 0, vertikalerGleitpunkt = 0;   // Koordinaten des neuen Punktes für die Lotgeraden
         double horizontalerGleitpunktStart = 0.1, vertikalerGleitpunktStart = 0; // Koordinaten für die Lotgeraden
         int hoechsterLauf = 300;             // Anzahl der Schleifen
         int aktuellerLauf = 1;             // Schleifenzähler

      FlowLayout g1 = new FlowLayout(FlowLayout.CENTER);     // Objekt wird gebildet

      public void setFaktor(double faktor)
         {                  // wird aufgerufen aus der HTML
            a = faktor;
           repaint();                // neu zeichnen
         }

      public void setIterationen(int iterations)
         {                  // wird aufgerufen aus der HTML
            hoechsterLauf = iterations;
           repaint();                // neu zeichnen
         }

      public void init ()
         {
          setLayout(g1);             // Layout wird auf den Bildschirm gezeichnet
         }

      public void paint (Graphics g)
         {                  // alles wird gezeichnet (Koordinatensystem, Parabel, Winkelhalbierende, Näherung an den Schnittpunkt)

      int x0, y0, x1, y1;             // x- und y-Koordinaten zum Zeichnen der Parabel
            double x, y;

      // Zeichnen des Koordinatensystems

      g.setColor(Color.black);                      // Farbe schwarz zum Zeichnen

      g.drawLine(0,vertikalerUrsprung,breite,vertikalerUrsprung); // x-Achse und die Pfeile
            g.drawLine(breite,vertikalerUrsprung,breite-10,vertikalerUrsprung-3);
            g.drawLine(breite,vertikalerUrsprung,breite-10,vertikalerUrsprung+3);

      g.drawLine(horizontalerUrsprung,0,horizontalerUrsprung,hoehe);      // y-Achse und die Pfeile
            g.drawLine(horizontalerUrsprung,0,horizontalerUrsprung-3,10);
            g.drawLine(horizontalerUrsprung,0,horizontalerUrsprung+3,10);

      // Zeichnen der Parabel

      x0 = 0;                                        // x-Wert am linken Rand (pixel)
            x = -horizontalerUrsprung/pixelProEinheit;                      // x-Wert berechnen
            y = a*x*(1-x);                                 // y-Wert berechnen
            y0 = (int)Math.round(vertikalerUrsprung-y*pixelProEinheit);  // y-Wert: typecasting und runden

      while (x0 < breite)
            {                              // Kopfgesteuerte Schleife mit Abbruchbedingung: läuft solange, wie das Koordinatensystem breit ist
               x1 = x0+1;                                   // Nächster x-Wert (pixel)
               x = (x1-horizontalerUrsprung)/pixelProEinheit;          // x-Wert berechnen
               y = a*x*(1-x);                               // y-Wert berechnen
               y1 = (int)Math.round(vertikalerUrsprung-y*pixelProEinheit);  // y-Wert: typecasting und runden

      if (y0 < vertikalerUrsprung) g.drawLine(x0,y0,x1,y1);     // Linie vom alten zum neu berechneten Punkt

      x0 = x1;             // der neue Punkt wird zum alten Punkt
               y0 = y1;

      }

      // Winkelhalbierende vom Ursprung nach rechts oben

      g.drawLine(horizontalerUrsprung,vertikalerUrsprung,horizontalerUrsprung+breite,vertikalerUrsprung-breite);

      // Startpunkte der Lotgeraden werden festgesetzt

      vertikalerGleitpunkt = vertikalerGleitpunktStart;
           vertikalerPunktAlt = (int)Math.round(vertikalerUrsprung-vertikalerGleitpunkt*pixelProEinheit);
           horizontalerGleitpunkt = horizontalerGleitpunktStart;
           horizontalerPunktAlt = (int)Math.round(horizontalerGleitpunkt*pixelProEinheit)+horizontalerUrsprung;
           // Iterationen für das Näherungsverfahren

      aktuellerLauf = 1;             // aktuellerLauf muss auf 1 zurückgesetzt werden, da sonst die Iteration bei repaint() nicht ausgeführt wird

      while (aktuellerLauf <= hoechsterLauf)
           {                 // solange bis hoechsterLauf größer als der aktuellerLauf ist

      if (aktuellerLauf % 2 != 0)          // Bedingung: ist die aktuelle Laufzahl ungerade -> vertikaler Strich
            {
             // vertikale Lotgerade

      vertikalerGleitpunkt = a*horizontalerGleitpunkt*(1-horizontalerGleitpunkt);
             vertikalerPunkt = (int)Math.round(vertikalerUrsprung-vertikalerGleitpunkt*pixelProEinheit);
             horizontalerPunkt = (int)Math.round(horizontalerGleitpunkt*pixelProEinheit)+horizontalerUrsprung;
             g.drawLine(horizontalerPunktAlt,vertikalerPunktAlt,horizontalerPunkt,vertikalerPunkt);

      // berechnete Werte werden zu Ausgangspunkten der horizontalen Lotgerade

      vertikalerPunktAlt = vertikalerPunkt;
             horizontalerPunktAlt = horizontalerPunkt;
            }

      else               // Bedingung: sonst -> horizontaler Strich
           {
             // horizontale Lotgerade

      horizontalerGleitpunkt = vertikalerGleitpunkt;
             vertikalerPunkt = (int)Math.round(vertikalerUrsprung-vertikalerGleitpunkt*pixelProEinheit);
             horizontalerPunkt = (int)Math.round(horizontalerGleitpunkt*pixelProEinheit)+horizontalerUrsprung;
             g.drawLine(horizontalerPunktAlt,vertikalerPunktAlt,horizontalerPunkt,vertikalerPunkt);

      // berechnete Werte werden zu Ausgangspunkten der vertikalen Lotgerade

      vertikalerPunktAlt = vertikalerPunkt;
             horizontalerPunktAlt = horizontalerPunkt;
            }

      aktuellerLauf+=1;            // Iterationszähler inkrementieren
           }

      }

      }

      1. hallo,

        Sieht gut aus nur bekomme ich es nicht zum Laufen. Beim erstellen der class gibt mir javac immer Fehler aus.

        Kann ich nicht nachvollziehen. Ich habe eben mal schnell deinen unveränderten Quelltext übernommen und kompiliert. Das geht fehlerfrei, nur ist die Zoomfunktion wirkungslos. Beispielseite findest du unter http://www.christoph-schnauss.de/test/test.htm, im Verzeichnislisting findest du sowohl die class- wie auch die java-Datei.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|