# Klick in der nähe einer Strecke



## Krause (1. Feb 2004)

Hallo,
ich habe folgendes Problem:

ich zeichne mittels Java2D einige dynamische Strecke auf den Bildschirm.
Jetzt will ich wenn der Benutzer auf oder in die nähe einer der Strecken klickt, diese hervorheben.

Wie kann ich herausfinden, ob die Maustaste in der nähe, oder auf einer dieser Strecken betätigt wurde.

Jede Strecken wird mithilfe von 2 Punkten gezeichnet, ich habe also zu jeder Strecke nur den Anfangs und Ednpunkt.

Wäre cool, wenn jemand ne Idee hätte

Danke

Krause


----------



## dayy_ands (2. Feb 2004)

Wie wärs wenn du ein Polygon außenherum erstellst(und es nicht anzeigst!) und überprüfst ob die Maus sich in dem Polygon befindet?
geht mit:

```
boolean reingeklickt = polygon.contains(maus.getX(), Maus.getY())
```


----------



## Krause (2. Feb 2004)

Wow, hört sich ja gut an 

Wie erstelle ich denn nen Polygon in Java2D?

Danke

Krause


----------



## stev.glasow (3. Feb 2004)

Krause hat gesagt.:
			
		

> Wie erstelle ich denn nen Polygon in Java2D?



http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Polygon.html


----------



## dayy_ands (4. Feb 2004)

GeneralPath ist ein Polygon in Java2D...
Der Link verweist auf ein Normales Polygon.
Abwer ich nehme an, dass es mit sowas genauso geht.


----------



## Acrobat (4. Feb 2004)

Andere Idee: Koordinaten des Klickpunktes nehmen und die Fläche des Dreiecks bestimmen, welches von diesem Punkt und den Endpunkten der Linie aufgespannt wird. Wenn diese Fläche kleiner als ein Schwellwert A ist, wurde die Linie getroffen. Sinnvollerweise sollte dies für alle Linien bestimmen und die kleinste Fläche nehmen.


----------



## chik (14. Feb 2004)

Die Idee von Acrobat hört sich auch nicht schlecht an, aber wie bestimme ich die Fläche des Dreiecks, wenn ich nur die 3 Eckpunkte habe?

Besser wäre es doch sogar, wenn ich die beiden Punkte der Strecke als Grundfläche nehme und dann die Höhe des Dreiecks errechne, das ist dann der Abstand von der Strecke, ist dieser unter einem Schwellwert, ist der Klick innerhalb.

Aber wie bestimme ich die Höhe eines Dreiecks, wenn ich nur 3 Punkte habe?

Krause


----------



## bummerland (14. Feb 2004)

Acrobat hat gesagt.:
			
		

> Andere Idee: Koordinaten des Klickpunktes nehmen und die Fläche des Dreiecks bestimmen, welches von diesem Punkt und den Endpunkten der Linie aufgespannt wird. Wenn diese Fläche kleiner als ein Schwellwert A ist, wurde die Linie getroffen. Sinnvollerweise sollte dies für alle Linien bestimmen und die kleinste Fläche nehmen.



sehe ich nicht als sehr sinnvoll an. wenn der klick auf der höhe der beiden punkte erfolgt, ist die fläche auch bei weit entferntem klick noch relativ klein. 



			
				chick hat gesagt.:
			
		

> Besser wäre es doch sogar, wenn ich die beiden Punkte der Strecke als Grundfläche nehme und dann die Höhe des Dreiecks errechne, das ist dann der Abstand von der Strecke, ist dieser unter einem Schwellwert, ist der Klick innerhalb.
> 
> Aber wie bestimme ich die Höhe eines Dreiecks, wenn ich nur 3 Punkte habe?



das klingt schon besser. die höhe des dreiecks aus drei punkten zu bestimmen sollte meiner meinung nach möglich sein, weiss aber jetzt nicht aus dem kopf, wie das war, müsste ich mnoch mal nachlesen.


----------



## chik (15. Feb 2004)

Ne, geht leider auch nicht mit der Höhe, weil wenn der Punkt nicht unterhalb oder oberhalb der Strecke liegt, ist das mit der Höhe nicht korreckt, weil dann ja kein Rechterwinkel zwishen Höhe und der Grundseite entsteht, oder kann man die Höhe dann auch ausrechnen?

Ansonsten ziehe ich einfach ein Rechteck um die Strecke und überprüfe ob der Punkt darin liegt.

Aber wie kann man überprüfen, ob ein Punkt, also deren Koordinaten (2D) in einem schief liegendem Recheck (2D) sind?

Danke Krause


----------



## bummerland (15. Feb 2004)

chik hat gesagt.:
			
		

> Ne, geht leider auch nicht mit der Höhe, weil wenn der Punkt nicht unterhalb oder oberhalb der Strecke liegt, ist das mit der Höhe nicht korreckt, weil dann ja kein Rechterwinkel zwishen Höhe und der Grundseite entsteht, oder kann man die Höhe dann auch ausrechnen?



doch, kann man trotzdem ausrechnen.



			
				chik hat gesagt.:
			
		

> Aber wie kann man überprüfen, ob ein Punkt, also deren Koordinaten (2D) in einem schief liegendem Recheck (2D) sind?



Schau dir mal in der API die Klasse Rectangle2D an. Die hat ne Methode contains(x, y) - die liefert dir, ob ein punkt in dem rechteck liegt.


----------



## chik (15. Feb 2004)

wollte die matematischen Berechnungen lieber selber programiren.

wie kann man denn die Höhe eines Dreiecks bestimmen, wenn man nur alle 3 Punkte des Dreiecks hat?

Und wie kann man überprüfen ob ein Punkt in einem Rechteck liegt?

Wäre cool, wenn jemand nen mathematischen Ansatz oder die Lösung posten könnte 

Danke
Krause


----------



## Beni (15. Feb 2004)

Höhe: lege eine Gerade durch zwei Punkte, gibt eine Glg der Form   a*x + b*y + c = 0
Der Abstand eines Punktes ( x0, y0 ) ist dann:

d = abs( a*x0 + b*y0 + c ) / sqrt( a^2 + b^2 )

Beni


----------



## chik (16. Feb 2004)

> Höhe: lege eine Gerade durch zwei Punkte, gibt eine Glg der Form a*x + b*y + c = 0



Mhh, wie errechne ich denn die Glg der 2 Punkte?

Die Gleichung einer Geraden is doch m*x + b = y oder?


Also ich habe ja eine Strecke, die durch 2 Punkte gegeben ist. Der dritte Punkt ist der Mausklick. Jetzt will ich den Abstand des dritten Punktes zu der Strecke berechnen. Also dachte ich, ich könnte die ersten beiden Punkte als Grundfläche des Dreiecks nehmen und dann die Höhe bestimmen. Aber wie berechne ich das?

Wie bekomme ich die Glg aus den 2 ersten Punkten?

Danke

Krause


----------



## Beni (16. Feb 2004)

m*x + b = y   ist so eine Krüppelgleichung mit dem Lehrer versuchen die Schüler dumm zu machen... :twisted:
a*x + b*y + c = 0 ist die allgemeine Gleichung (die *jede* 2-dimensionale Gerade abdeckt)

Zum lösen: du hast die beiden Punkte (x1, y1) und (x2, y2).

dann musst du das Gleichungssystem

x1*a + y1*b + c = 0
x2*a + y2*b + c = 0

auflösen. (a, b, c sind die Unbekannten). 

Weil (a,b) den senkrechten Vektor auf die Gerade beschreibt kannst du a= (y2-y1), b = (x1-x2) setzen.
(   (x1-x2)(y2-y1) + (y1-y2)(x1-x2) = 0 sind also senkrecht   )

auf c kommst du selber :wink:

Und der Abstand des 3. Punktes ist dann d (siehe Post oben)

mfg Beni


----------



## chik (16. Feb 2004)

> Weil (a,b) den senkrechten Vektor auf die Gerade beschreibt kannst du a= (y2-y1), b = (x1-x2) setzen.



Mhh, aber was ist denn, wenn der dritte Punkt von dem Dreieck, nicht senkrecht über der Grundfläche liegt. Also wenn dieser Punkt z.B. viel weiter rechts liegt als die beiden anderen, dann kann ich die Höhe nicht ausrechnen, oder? Oder viel mehr, dann würde ich für meine zwecke die falsche Höhe bekommen, denn ich benötige ja den Abstand des dritten Punktes von der Strecke.

Trotzdem schonmal Danke

Krause


----------

