Forum
Tipps
News
Menu-Icon

Java Grafik

Hallo ich habe seit diesem Jahr Informatik und in ein paar Tagen steht eine Klausur an. Wir arbeiten mit "eclipse" und haben Zeichenbefehle wie z.B. s.fillRect(x,x,x,x); usw gelernt. Seit neustem arbeiten wir mit Schleifen und dort habe ich auch mein Problem. Auf dem angehängten Bild ist eine Grafik zu sehen die wir mit einer Schleife und so wenig Zeichenbefehlen wie möglich darstellen sollen. Ich komme jedoch nicht selber auf die Lösung. Hat jemand eine Idee? Es wäre sehr nett wenn ihr auch eine kleine Erklärung dazuschreiben würdet wie man auf die einzelnen Koordinaten kommt z.B..
Hoffe auf Hilfe :)


Antworten zu Java Grafik:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich würde dazu einfach so vorgehen:
1. Die Grafik in kleine Bestandteile zerlegen. Hier künnte man z.B. dieses "V" mit dem Quadrat unten dran nehmen; also das Quadrat mit jeweils einer Linie schräg nach oben links und oben rechts.
2. Die Koordinaten überlegen, du hast da ja schon einen "Grundabstand" von 25px in die Grafik geschrieben. Der zu zeichnende Grafikbestandteil ist also immer 75x50px groß, danach kommt 25x50px nichts und dann wieder von vorne usw.. Das ganze für jede Zeile bis die Fläche voll ist. Innerhalb des Fragments musst du dann ein Quadrat (25, 25, 50, 50) und zwei Linien (0, 0, 25, 25) und (50, 25, 75, 0) malen.
3. Eine Schleife überlegen, die das für dich übernimmt.

// Platzhalter für die wirkliche Breite der Zeichenfläche,
// die musst du natürlich irgendwie rauskriegen
final int WIDTH = 525;
// und hier die Höhe
final int HEIGHT = 250;

public void paint( Graphics g ) {
   
    // Größe der Teilgrafik
    final int myShapeWidth = 75;
    final int myShapeHeight = 50;

    //aktuelle Koordinaten
    int x = 0;
    int y = 0;
    while( HEIGHT - y - myShapeHeight >= 0 ) { //solange noch Platz für eine weitere Reihe ist

        // Einrückung um 50px für jede 2. Zeile:
        if( y % 100 == 0 ) x = 0;
        else x = 50;

        while( WIDTH - x - myShapeWidth >= 0 ) { //und Platz für eine "Zeile"...
            drawMyShape( g, x, y );
            x += 100; //75 Breite + 25 "Pause"
        }
        y += 50; //Höhe
    }
}

void drawMyShape( Graphics g, int x, int y ) {

    // x und y geben den Offset an, d.h. den oberen linken Punkt der Teilgrafik.
    // Die Zahlen sind genau die in Schritt 2 überlegten.
    g.fillRect( x+25, y+25, 25, 25 );
    g.drawLine( x+0,  y+0,  x+25, y+25 );
    g.drawLine( x+50, y+25, x+75, y+0 );
}

Hoffe, dass das funktioniert und auch halbwegs verständlich ist. Und drei Zeichenbefehle sind ziemlich wenig oder?
« Letzte Änderung: 07.11.08, 15:58:50 von Lisaa »

Vielen Dank schonmal für die Antwort=)
Ich habe sie noch nicht getestet aber ich kann sie nachvollziehen. Leider haben wir auch noch nicht die wenn/dann Befehle behandelt, so wie ich das verstanden habe hast du ja welche benutzt. Hier ist nochmal ein Beispiel aus dem Unterricht wo wir mit nur einem Zeichenbefehl und nur einer  Schleife ein Schachbrett darstellen sollten.
Ich hoffe dass du damit etwas anfangen kannst, wie man auf die 4 Koordinaten kommt verstehe ich noch nicht ganz.
Das Bild das ich hochgeladen habe müsste man wirklich mit 3 Zeichenbefehlen hinbekommen, einmal die schwarzen Quadrate,  die Linien schräg nach unten und die Linien schräg nach oben. Dazu eben noch eine Schleife.

package Schachbrett;

import java.awt.*;
import java.applet.*;
public class Schachbrett extends Applet{
   public void paint (Graphics s){
      int b=25;
      for (int i=0; i<32; i=i+1){
      s.fillRect((i%4)*2*b+b*((i/4)%2), ((i/4)*b), b, b); //Schwarze Kästchen
      }
   }
}

Kommst du damit darauf wie man es darstellen könnte?

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hmmm, man bekommt es sicherlich ohne if/else und mit nur einer Schleife (statt 2 wie bei mir) hin. Das wäre dann aber genauso eine unverständliche Rechnerei wie in dem Beispiel mit dem Schachbrett.
Das verstehe ich übrigens so auf die Schnelle auch nicht und diese Rumrechnerei mit den Koordinaten ist sehr fehleranfällig, wenig flexibel (wenn man ein kleineres/größeres Brett haben will) und somit schlechter Stil. Außerdem sind if/else einfacher und IMHO wichtiger als Schleifen und sollten noch vor den Schleifen drankommen. - Hilft dir jetzt auch nichts, ich weiß... meine Schachbrettvariante sieht ungefähr so aus (analog zu dem Beispiel oben):

public void paint( Graphics g ) {

    // Anzahl Zeilen und Spalten. Einfach ändern für andere Bretter
    final int COLUMNS = 8;
    final int ROWS = 8;

    // Höhe/Breite der Kästchen
    final int b = 25;

    int x = 0;
    int y = 0;

    while( ROWS * b - y - b >= 0 ) { //solange noch eins passt...
        // Versetzt anfangen mit den schwarzen Kästchen
        if( y % (2*b) == 0 ) x = b;
        else x = 0;
        while( COLUMNS * b - x - b >= 0 ) { //solange noch ne Reihe muss
            g.fillRect( x, y, b, b );
            x += 2*b; //1b fürs Kästchen und 1b "Pause"
}
y += b; //eine Reihe tiefer
    }
}

zu dem Bild, ich bin in seinem Informatik kurs und ich habe dafür folgendes raus....

Mit der Methode die wir gelernt haben halt

SCHLEIFE1

package Schleife1;
import java.awt.*;
import java.applet.*;
import java.applet.*;

public class Schleife1 extends Applet{
 public void paint (Graphics s){
int b= 25;
for (int i=0;i<25;i=i+1)
{
s.drawLine((i%5)*4*b+2*b*((i/5)%2),(i/5)*2*b,(i%5)*4*b+2*b*((i/5)%2)+b,(i/5)*2*b+b);

 //s.drawLine((i%5)*4*b-3*b*((i/5)%2-1)+b*((i/5)%2), (i/5)*2*b, (i%5)*4*b-3*b*((i/5)%2-1)+b*((i/5)%2)-b, (i/5)*2*b+b); // Nicht wie auf dem Bild (ungerade Zeile nur um b verschoben)

s.drawLine((i%5)*4*b-3*b*((i/5)%2-1)+5*b*((i/5)%2), (i/5)*2*b, (i%5)*4*b-3*b*((i/5)%2-1)+5*b*((i/5)%2)-b, (i/5)*2*b+b); // Wie auf dem Bild (ungerade Zeile um 5b verschoben)

s.fillRect((i%5)*4*b-b*((i/5)%2-1)+3*b*((i/5)%2),(i/5)*2*b+b,b,b);
}
 }
}

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ui, sowas hatte ich befürchtet...  :o
Ich verstehe den Sinn dahinter nicht so ganz. Immerhin verbringt man wahrscheinlich (oder bin ich zu blöd dafür?) deutlich mehr Zeit damit, diese komischen Formeln für die Koordinaten auszurechenen als mit dem Programmieren selbst - und das ist es doch, was ihr lernen sollt oder?

Ja du hast recht. Ich verstehe den Sinn dahinter auch nicht ganz ???, ich werde es unserer Lehrerin nächste Stunde vorschlagen wir haben noch eine Stunde zur Übung. Vielen dank aber nochmal für die Hilfe an alle ;)

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Ich würde jeweils so einen 4Strang in eine methode schreiben..

also insgesamt 5 quadrate und diese dann in x und y mit zwei forschleifenverschieben.

musst einfach achten das der quadrat ganz links oben der fünf in x richtung mit dem ganz rechts übereinliegt und das selbe unten links. Alles andere benötigt zu viel mathe, immer schauen was kann man gleichmässig verschieben ohne if und sonstige entscheidungen zu verwenden.


« C# - Klick Counterexit(x); »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Bildpunkte
Bilder, die von einem Monitor wiedergegeben werden, bestehen aus einzelnen Bildpunkten (Pixeln). Je höher die Pixelanzahl ist, desto genauer und besser kann das Bild...

Bildschirmschoner
Der eigentliche Sinn des Bildschirmschoners ist, den Bildschirm vor dem Einbrennen des Monitorbildes zu schützen.Während das bei neueren Monitoren (außer ...

Bildwiederholfrequenz
Auf Bildschirmen erscheint ein Bild nur Bruchteile von Sekunden, weil die es erzeugenden Elektronenstrahlen oder Impulse sehr kurzzeitig wirken. Deshalb wird es mit einer...