Graphikeditor - wer kann mir helfen?

Status
Nicht offen für weitere Antworten.

Sindbad1983

Top Contributor
Hi!

Ich möchte einen Graphikeditor schreiben, der eine Menge von Figuren(Rechtecke, Kreise etc. verwaltet). Jede Figur hat eine Methode contains, mit der man prüfen kann, ob ein Punkt (geg. durch x und y-Koord. innerhalb der Figur liegt!

Wenn ich jetzt ein Rechteck implementiere, dann funktionierts.....beim Kreis hingegen stimmts nicht, weil ja die Ecken abgeschnitten sind...aber das funktioniert da nicht!Beim Punkt 51,51 müsste es false ausgeben!
Wo liegt da der Fehler?
Kennt jemand die Lösung?



Code:
abstract class Figure{
	public abstract boolean contains(int x, int y);
}


class Rectangle extends Figure{

	int xpoint;
	int ypoint;
	int length;
	int width;
	boolean ergebnis=true;

	public Rectangle(int xpoint, int ypoint, int length, int width){
		this.xpoint=xpoint;
		this.ypoint=ypoint;
		this.length=length;
		this.width=width;
	}

	public boolean contains(int x,int y){

		if(xpoint <=x && x<=xpoint+width && ypoint <=y && y<=ypoint+length){

			return ergebnis;
		}
		else{
			return false;
		}
	}


}


class Circle extends Figure{

	int xpoint;
	int ypoint;
	int radius;
	boolean ergebnis=true;

	public Circle(int xpoint, int ypoint, int radius){
		this.xpoint=xpoint;
		this.ypoint=ypoint;
		this.radius=radius;
	}

                //hier liegt der Hund begraben!!!!!
	public boolean contains(int x, int y){

		if(x>=xpoint-radius && x<=xpoint+radius && y<=ypoint+radius && y>=ypoint-radius){

				return ergebnis;
		}
		else{
				return false;
		}

	}
}

und die Klasse Test :

Code:
public class Test{

	public static void main(String [] args){

			Rectangle r1=new Rectangle(100,100,50,60);
			boolean ergebnis= r1.contains(100,130);
			System.out.println("Punkt in Rechteck:"+ergebnis);


			Circle c1=new Circle (100,100,50);
			ergebnis=c1.contains(51,51);
			System.out.println("Punkt in Kreis:"+ergebnis);

		}
}

Vielen Dank im Voraus!

ciao,Tommy
 

dotlens

Top Contributor
du frags ja auch ab, ob das ganze im viereck liegt. auch wenn du als länge den radius nimmst....

du kannst mit dem pytagoras sätzchen ausrechnen, wieviel das ausmacht, da der Radius ja nicht genau waagrecht bzw senkrecht verlaufen muss
 

Sindbad1983

Top Contributor
hä?

Wie meinst du das?

da kommt mir nur rechtwinkeliges Dreieck in den Sinn!!
Wo und wie soll das zusammenhängen?
Kannst du mir ein kleines Beispiel geben?
Bitte!
 

dotlens

Top Contributor
hmm hab mich n bisschen vertan.

du brauchst den kosinus:
zuerst musst du den Winkel herausfinen, indem die Strecke (dein Punkt zum mittelpunkt des kreises) zur waagrechten liegt.
wenn du den hast kannst du rechnen :

wenn cos(winkel) * radius
kleiner ist als cos(winkel) * Streckenlänge, ist der Punkt im Kreis

ansonsten nicht... wenn dus nicht verstehts frage noch im mathe forum nach, die umsetzung ist ja warscheinlich nicht so das problem... ;)

EDIT: wenn der Winkel 90/ 180 /270 / 360 Grad ist, ist der Kosinus 1, was heisst, dass der Ganze Radius verwendet wird.
 

AlArenal

Top Contributor
Er will sagen, dass dein Alogorithmus falsch ist.

Ein Punkt liegt in einem Kreis, wenn sein Abstand vom Kreismittelpunkt geringer ist als die Länge des Radius. Du musst also zunächst den Abstand zwischen Mittelpunkt und Punkt berechnen, also die Länge der Linie zwischen den beiden Punkten. Die resultierende Länge vergleichst du mit dem Radius.
Diese Länge (die Linie zwischen den Punkten) ist, wenn mich nicht alles täuscht, die Hypothenuse eines rechtwinkligen Dreiecks. Das wollte Sindbad dir vermutlich sagen.

Die beiden anderen Seiten des Dreiecks werden durch die Linien aufgespannt, die zwischen den beiden Punkten und einem Punkt liegen, der sich aus (Mittelpunkt.x, Punkt.y) bzw. an der gesuchten Seite gespiegelt aus (Punkt.x, Mittelpunkt.y) zusammensetzt.

Wenn du dir das aufzeichnest, wird es dir wie Schuppen aus den Haaren fallen. ;)

Das was du derzeit machst ist, dass du prüfst, ob der Punkt in dem den Kreis umgebenden Rechteck (bounding rectangle) liegt.

Das kannst du höchstens zur Performance-Optimierung nutzen, denn liegt der Punkt nicht im bounding rectangle, brauchst du die recheninternsivere Prüfung, ob der Punkt in deinen Grafikobjekten liegt, nicht durchführen. Für jede deiner Grafik-Objekt-Klassen musst du deine Methode entsprechend anpassen. Ist ne Aufgabe für Leute die gut in Mathe sind.

Ich arbeite beruflich auch mit einer Grafik-Lib, in der ich eigene Objekte zeichne. Derzeit belasse ich es noch bei der Prüfung des bounding rectangle, was noch ausreichend ist. Aber die Zeit wird kommen, wo das nicht mehr so hinhaut...
 

AlArenal

Top Contributor
Wie man sieht gibts mehrere Wege zum gesuchten Ergebnis zu kommen. Muss man im einzelnen mal testen was am schnellsten berechnet wird.

Das waren noch Zeiten, wo man den Scheiß in C mit allen Tricks gemacht hat.. Bits durch die Register shiften, den Kram in Inline-Assembler machen und nachschlagen welche FPU wieviele Takte braucht.. bzw. den Kram ohne FPU machen und Takte addieren.. Lang lang ists her...
 

Sindbad1983

Top Contributor
Jetzt möcht ich eine Methode schreiben, die jene Figur aus der Liste figures liefert, die den Punkte mit den Koord. x und y enthält!Wenn es keine solche Figur gibt, soll null geliefert werden;wenn es mehrer passende Figuren gibt, soll die erste geliefert werden.Die Liste soll mit Hilfe eines Iterators durchlaufen werden..!

Aber wo passt die Methode jetzt rein?
Bei Circle oder Ractangle?
Oder muss ich eine neue Klasse schreiben?

Außerdem stimmt da irgendwas nicht...!

...maaa, des is schwer...! :oops:



Code:
public Figure find(ArrayList figures, int x, int y){

		Figure fig;

		Iterator it=figures.iterator();

		if(figures==null){
			return null;
		}

		else{
			while(it.hasNext()){
				if(fig.contains(x,y)==true){
					return fig;
				}
				else{
					fig=it.hasNext(); //das hasNext() mag er nicht!!!??!!!
				}
			}


	}
	}
[quote]

Danke für eure Hilfe!![/quote]
 

dotlens

Top Contributor
versuchs mal mit it.next() :D

hasNext() gibt einen boolean zurück, ob noch elemente vorhanden sind. mal unter uns: du hast keine ahnung was du da geschrieben hast, was? ;)
 

Sindbad1983

Top Contributor
incompatible types
found : java.lang.Object
required: Figure
fig=it.next();
^
1 error

..naja..was heißt Ahnung..hab noch nie mit einer ArrayList gearbeitet....

it.next() hab ich nämlich vorher auch schon mal probiert! ;-)
 

Sindbad1983

Top Contributor
nein..leider ...das geht auch nicht

java:55: variable fig might not have been initialized
if(fig.contains(x,y)==true){

Wenn du dir mein erster Posting anschaust...da hab ich die Klassen Circle, Rectangle und Test!

Und ich weiß nicht, wo die Methode find hineingehört!..in welche Klasse...oder brauch ich eine neue!
Das sind halt eben die Verständnisprobleme eines Anfängers...!
;-(
Tut mir leid!
Aber ich bin echt froh, dass es solche hilfsbereiten Menschen gibt wie euch!
Danke
 

dotlens

Top Contributor
das kommt daher, dass du deine variable fig erst initialisierst nach dem du das erste mal die abfrage mit if(fi.cont....) hast

du musst das fig = (Figure)it.next() nach vorne nehmen....

ich würde eine eigent klasse machen...
 

Sindbad1983

Top Contributor
Oh Mann..ich verzweifle schön langsam :cry:

Ich hab jetzt eine 3. Klasse Liste hinzugefügt:

Der Compiler kennt keinen Fehler, aber in der Ausgabe zeigt er nur

Punkt in Rechteck:true
Punkt in Kreis:false

....aber nichts über fig!

Die Klasse List mit der Methode find stimmt aber jetzt schon!Wahrscheinlich liegt der Hund jetzt in der Klasse Test begraben.... :shock:



Code:
import java.util.ArrayList;
import java.util.Iterator;

abstract class Figure{

	public abstract boolean contains(int x, int y);


}
//......Klasse Circle und Rectangle fehlen da jetzt....

class Liste{

	public Figure find(ArrayList figures, int x, int y){

			Figure fig;


			Iterator it=figures.iterator();
			fig=(Figure) it.next();


			if(figures==null){
				return null;
			}

			else{
				while(it.hasNext()){

					if(fig.contains(x,y)==false){
						fig=(Figure) it.next();
					}

				}
				return fig;


		}
		}
}


Klasse Test:

Code:
import java.util.*;


public class Test{

	public static void main(String [] args){

			Rectangle r1=new Rectangle(100,100,50,60);
			boolean ergebnis= r1.contains(100,130);
			System.out.println("Punkt in Rechteck:"+ergebnis);


			Circle c1=new Circle (100,100,50);
			ergebnis=c1.contains(30,51);
			System.out.println("Punkt in Kreis:"+ergebnis);


			ArrayList figures=new ArrayList();
			figures.add(r1);
			figures.add(c1);

			Liste list=new Liste();
			Figure fig=list.find(figures,150,150);
			System.out.println(fig);



		}
}


Danke für Eure Hilfe!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Kann mir jemand helfen? Java Basics - Anfänger-Themen 2
C Kann mir jemand helfen was mit diesen Fehlern gemeint ist ? Java Basics - Anfänger-Themen 12
Fiedelbambu deriveFont Fehler wer kann Helfen? Java Basics - Anfänger-Themen 4
HeiTim Kann mir Jemand helfen ? Java Basics - Anfänger-Themen 11
T Ich habe eine Variabel die nicht Methoden übergreifend ist. Kann mir jemand Helfen :) Java Basics - Anfänger-Themen 5
G Fehlersuche-kann mir jemand helfen? Java Basics - Anfänger-Themen 46
U Ist jemad gut in programmieren (JAVA) und kann mir helfen? Java Basics - Anfänger-Themen 1
D Könnt ihr mir helfen beim Programmieren eines Ping Pong Spieles? Java Basics - Anfänger-Themen 9
A Erste Schritte Bitte helfen sie mir diese Programm zu schreiben Java Basics - Anfänger-Themen 12
J Guten tag, Ich hoffe ihr habt einen schönen Sonntag und könnt mir helfen Java Basics - Anfänger-Themen 2
A GUI- Allgemeines Problem (Bitte helfen) Java Basics - Anfänger-Themen 15
M Wer kann mir helfen ? Java Basics - Anfänger-Themen 1
B GUI Probleme - Wer kann helfen Java Basics - Anfänger-Themen 6
F hat jmd Zeit mir bisschen zu helfen msn/skype Java Basics - Anfänger-Themen 10
A Teamspeak-Teamviewer helfen Java Basics - Anfänger-Themen 3
U Bitte Helfen kleines Spiel Java Basics - Anfänger-Themen 9
S Klasse Zeichenfenster und BlueJ - Könnt ihr mir helfen? Java Basics - Anfänger-Themen 4
J Datentypen Generics - Bitte helfen !! Java Basics - Anfänger-Themen 9
K 50 errormeldungen- komme auch nach vielen Nachmittagen nicht weiter. bitte helfen Java Basics - Anfänger-Themen 39
Z Blutiger Anfänger sucht nette Leute die gern helfen Java Basics - Anfänger-Themen 49
D Ausgabe in Datei ( bitte helfen ) Java Basics - Anfänger-Themen 13
S Bitte helfen: Datum vergleichen? Java Basics - Anfänger-Themen 10
K Hilfe beim starten eines Programms! Bitte helfen. Java Basics - Anfänger-Themen 8
M Wer kann mir bei Primzahlen helfen ? Java Basics - Anfänger-Themen 4
J Tolle Aufgaben Stellung - wer kann helfen? Java Basics - Anfänger-Themen 12
M Methoden. ich versteh das einfach nicht! Bitte helfen! Java Basics - Anfänger-Themen 4
H [req] wer kann mir helfen die aufgabe zu lösen? Java Basics - Anfänger-Themen 2
G Parsen des Datums nicht möglich! Wer kann helfen? Java Basics - Anfänger-Themen 7
C Kann jemand mir helfen? Java Basics - Anfänger-Themen 15
A Starthilfe für Java. Bitte helfen :-( Java Basics - Anfänger-Themen 13
N Kann mir bitte jemand helfen? Java Basics - Anfänger-Themen 6
A Java Versionsproblem? Bitte helfen! Java Basics - Anfänger-Themen 4
D kann mir jmd. bei einem java programm helfen? Java Basics - Anfänger-Themen 7
M Habe ein Problem mit dem Konstruktor!Wer kann helfen? Java Basics - Anfänger-Themen 15
H strings auf gleichheit / ungleichheit prüfen wer kann helfen Java Basics - Anfänger-Themen 4
S Kann mir einer helfen? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben