etch a sketch

Status
Nicht offen für weitere Antworten.

roberlin

Mitglied
hi! wir machen im erstn semester grad ne etch a sketch übung, es gibt eine EzchASketch.java:


Code:
package sketchboard;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;
import horizvertidiagDrawing.DrawingInstructor;

public class EtchASketch extends JFrame {
	public static int GAP = 99999;
	
	private Graphics graphics;
	int lastX = translateX(0), lastY = translateY(0);
	boolean gap = false;
	
	public EtchASketch() {
		this.setTitle("Etch A Sketch: "+DrawingInstructor.getTitle());
		this.setSize(700, 500);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		graphics = this.getGraphics();
		graphics.setColor(Color.red);
	}
	
	private void setStartingPoint() {
		lastX = DrawingInstructor.firstX(this.getWidth());
		lastY = DrawingInstructor.firstY(this.getHeight());
		lastX = translateX(lastX);
		lastY = translateY(lastY);
	}
	
	private void drawLine() {
		int x=DrawingInstructor.nextX(this.getWidth());
		int y=DrawingInstructor.nextY(this.getHeight());
		if (x==GAP || y==GAP) 
		{ gap=true; return; }
		x = translateX(x);
		y = translateY(y);
		if (gap) 
		{ gap=false; 
		  lastX = x; 
		  lastY = y;
		}
		else 		
		{ if (visible(x,y)) graphics.drawLine(lastX, lastY, x, y);
		  lastX = x; 
		  lastY = y;
		}
	}
	
	private int translateX(int coordinate) {
		return this.getWidth()/2 + coordinate;
	}
	
	private int translateY(int coordinate) {
		return this.getHeight()/2 - coordinate;
	}
	
	private boolean visible(int x, int y){
		return !(x<0 || y<0 || x>this.getWidth() || y>this.getHeight());
	}
	
	public static void main(String[] args) {
		EtchASketch board = new EtchASketch();
		board.setStartingPoint();
		while (true) 
		{	board.drawLine();
			try{ Thread.sleep(10); }
			catch (InterruptedException x) {}
		}
	}

}


und dann gibts noch ne DrawingInstructor.java:

package horizvertidiagDrawing;

public class DrawingInstructor {
	private static int x=0, y=0;

	
	public static String getTitle() {
		return "erst diagonal, dann horizontal, dann vertikal";
	}

	public static int firstX(int max) {

		x=???;
		return x;
	}

	public static int firstY(int max) {

		y=-???;   // center of drawing panel = left bottom corner
		return y;
	}

	public static int nextX(int max) {
		x=x+3;      // 
		return x;
	}

	public static int nextY(int max) {
		y=x+2; 
		return y;  // 
	}

}


ich kapiere nicht, wie ich den startpunkt, als firstX und firstX festlege (der soll unten links in die ecke!)!! denke, dass geht irgendwie über "max", das komischerweise auch nirgends initialisiert ist. wenn ich zahlen für x und y angebe, kann ich mich zwar der ecke links unten nähern, aber wenn ich dann für nextX und nextY andre ausdrücke einsetze verschiebt sich das! besten dank f kommentare!

[Edit by Beni: Codetags]
 

roberlin

Mitglied
die dozentin schrieb dazu in der aufgabe noch: The drawing panel has a Cartesian coordinate system, with (0,0) in the center of the panel. As the size of the panel may vary, the maximum coordinate is passed to the functions as a parameter. So the signature is public static int nextX(int max); a value of 200 for max means that x coordinates may range from –200 to +200, and similar for y. If you pass a coordinate beyond these limits to EtchASketch, it will simply be ignored.

versteh ich auch nicht, wenn ich firstX und firstY auf -200 setze ist der startpunkt jedenfals nicht links unten in der ecke...
 
B

Beni

Gast
Das ist ja das absolute Antibeispiel guter Programmierkunst :autsch:

Die 200 sind nur ein Beispiel, es könnte ebensogut 473 da stehen.

"max" wird beim Aufruf der Methode vom Aufrufer übergeben, ist also stets initialisiert.

Der Kommentar der Dozentin und die tatsächliche Benutzung von max passen nicht zusammen:
Code:
      int x=DrawingInstructor.nextX(this.getWidth());
      int y=DrawingInstructor.nextY(this.getHeight());
... hier wird für max jeweils die Breite "getWidth", bzw. die Höhe "getHeight" eingesetzt. Das würde bedeuten: "max ist die Differenz der grössten und der kleinsten Koordinate".

Eine einfache Korrektur wäre nicht "getWidth()" und "getHeight()" zu übergeben, sondern jeweils "getWidth()/2" und "getHeight()/2"). Dann wäre der Kommentar wieder stimmig.
 

roberlin

Mitglied
getWidth und getHeight kommen aus der EtchASketch.java nicht aus der DrawingInstructor.java, ich hatte die code-tags vergessen, daher sieht das hier wie eine datei aus, sorry! schaffe es aber auch nicht , getWidth aus der EtchASketch.java für nextX in DrawingInstructor.java zu benutzen, so weit waren wir leider noch nicht :( viell habe ich deinen hinweis auch gänzlich missverstanden...
 
B

Beni

Gast
Ja, ändere doch die EtchASketch-Datei. Oder wenn du das nicht darfst, dann benutze nur die halbe "max"-Grösse.

Im letzten Fall wäre die untere linke Ecke (-max/2, -max/2).
 

roberlin

Mitglied
du meinst so für die DrawngInstructor.java? die etchasketch darf ich in der tat nicht ändern

Code:
package horizvertidiagDrawing;

public class DrawingInstructor {
	private static int x=0, y=0;

	
	public static String getTitle() {
		return "horizontal, vertikal, diagonal";
	}

	public static int firstX(int max) {
		x=-max/2;
		return x;
	}

	public static int firstY(int max) {
		y=-max/2;  
		return y;
	}

	public static int nextX(int max) {
		x=x+3;       
		return x;
	}

	public static int nextY(int max) {
		x=x+1; 
		return y; 
	}

}

klappt leider nicht, so gibt er auf dem sketchboard gar keine rote diagonale aus (oder fängt sonstwo ausserhalb des sichtbaren bereiches damit an, jedenfalls seh ich gar keine rote linie mehr, auch keinen punkt...)
 

roberlin

Mitglied
ups, fataler fehler meinerseits, mit

Code:
	public static int nextY(int max) {
		y=y+1; 
		return y;

gehts natürlich, ich idiot!
 

roberlin

Mitglied
hätte da noch eine letzte frage für haute:

wenn ich eine diagonale mache:

Code:
...
public static int firstX(int max) {
		x=-max/2;
		return x;
	}

	public static int firstY(int max) {
		y=-max/2;   
		return y;
	}

	public static int nextX(int max) {
		x=x+1;     
		return x;
	}

	public static int nextY(int max) {
		y=y+1; 
		return y;  
	}
...

fängt er unten links in der ecke an! sie geht aber nicht rechts oben in die ecke, weil es kein quadrat ist (stichwort "slope" im englischen glaub ich, egal...)


wenn ich nun die geschwindigkeiten anpasse um sie oben rechts in die ecke zu kriegen, z.b. mit:

Code:
...
	public static int nextX(int max) {
		x=x+3;     
		return x;
	}

	public static int nextY(int max) {
		y=y+2; 
		return y;  
	}
...

fängt er leicht versetzt nach rechts an und nicht mehr unten in der diagonale! kannst du mir anfängerfreundlich erklären, woran das liegt? geht es trotz verschiedener geschwindigkeiten für x und y unten in der ecke anzufangen oder muss ich zwangsweise in der etchasketch ein quadrat aus der größe machen...

ich verneige mich, bisher schon mal ne tophilfe, hat einige aggressionen abgebaut :wink: thxx!!
 

roberlin

Mitglied
"...fängt er leicht versetzt nach rechts an und nicht mehr unten in der diagonale! "


...nicht mehr unten links in der ecke mein ich natürlich (zuviel kaffe)
 
B

Beni

Gast
Wieso die Linie nun versetzt ist, kann ich nicht erklären.
[Edit: nunja, dieser Gruselcode beachtet nicht, dass das Fenster noch einen Rahmen hat. IMHO sind deshalb die Koordinaten leicht versetzt]

Aber das andere Problem: du könntest jedesmal z.B. 10% des max-Wertes zu x/y hinzuzählen. Der max-Wert ist ja jeweils die gesammte Strecke die in x oder y-Richtung zurückgelegt werden muss (lass dich nicht verwirren, es gibt in diesem Programm mehr als eine Varialbe "max". Die Variablen können immer wieder andere Werte beinhalten). Nach 10 Schritten hättest du dann je 100% -> also wärst du in der anderen Ecke.

Also z.B. "x += (int)(0.1 * max);"
 

roberlin

Mitglied
klappt leider nicht...

der code scheint wirklich scheisse zu sein, weil er sowas wie fenstergröße/rahmen nicht beachtet.

selbst wenn ich in

Code:
   public EtchASketch()

Code:
    this.setSize(700, 500);

auf

Code:
    this.setSize(700, 700);

setze(also quadratisch!), kommt die rote linie bei

Code:
x = x+1;     
return x;

und

Code:
y = y+1;     
return y;

nicht exakt rechts oben an. naja, nervt ganz schön, wenn sich die dozenten keine mühe geben...

in jedem fall nochmal vielen dank, ich werd das mal in der vorlesung ansprechen!

grüße
 

Marco13

Top Contributor
Dann kannst du der Dozentin auch gleich noch eine Kleinigkeit mitteilen:

NIE auf Components 'getGraphics' aufrufen!!!

(Wenn die Leute das irgendwo so beigebracht bekommen, wundert mich nichtmehr, warum man sich hier dauernd damit rumschlagen muss :x )
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben