Applet zoomen
Robert E. Lee
- javascript
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
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.
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
}
}
}
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.