Polygon.Contains() funktioniert nicht richtig?

Status
Nicht offen für weitere Antworten.

Rene_Meinhardt

Mitglied
Hallo, mein programm arbeitet mit selbstdefinierten shapes, die der anwender maus-sensitiv ansprechen kann. ich habe ein beispiel-code hier. nun habe ich folgendes festgestellt: befindet sich der mauszeiger auf der linken oder oberen kante, liefert die methode Polygon.contains(Point) true zurück. befindet sich der mauszeiger allerdings auf den rechten oder unteren kante des polygons, ist das rückgabeergebnis false. auch wenn ich vor dem zeichnen des polygons dieses als clipping-region per setClip(polygon) setze, fehlt nach dem zeichnen - wahrscheinlicherweise aufgrund der falschen contains-rückgaben - die rechte und untere kante.
wie kann man übergehen?
mit freundlichen grüßen aus berlin,
René

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ContainsTest extends JFrame {
	private static final long serialVersionUID = 1L;
	Polygon polygon = new Polygon();
	JLabel jLabelPositionX = new JLabel("x Position : ");
	JLabel jLabelPositionY = new JLabel("y Position : ");
	JLabel jLabelIsInShape = new JLabel("Mouse position is in shape ? ");

	public ContainsTest() {
		this.setBounds(50, 50, 500, 500);
		this.setVisible(true);
		polygon.addPoint(50, 50);
		polygon.addPoint(50, 200);
		polygon.addPoint(150, 200);
		polygon.addPoint(150, 50);
		this.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
		this.getContentPane().setLayout(null);
		
		this.getContentPane().add(this.jLabelPositionX); 
		jLabelPositionX.setBounds(200, 200, 250, 25);
		this.getContentPane().add(this.jLabelPositionY); 
		jLabelPositionY.setBounds(200, 225, 250, 25);
		this.getContentPane().add(this.jLabelIsInShape); 
		jLabelIsInShape.setBounds(200, 250, 250, 25);
		
		this.addMouseMotionListener(new MouseAdapter(){
			@Override
			public void mouseMoved(MouseEvent mE) {
				jLabelPositionX.setText("x Position : " + mE.getX());
				jLabelPositionY.setText("y Position : " + mE.getY());
				jLabelIsInShape.setText("Mouse position is in shape ? " + polygon.contains(mE.getPoint()));
			}});
	}

	public static void main(String[] args) {
		ContainsTest clipTest = new ContainsTest();
		clipTest.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	}

	public void paint(Graphics g) {
		g = (Graphics2D) g;
		super.paintComponents(g);
		super.paint(g);		
		super.paintAll(g);		
		
		g.setColor(Color.BLACK);
		//g.setClip(polygon);
		g.drawPolygon(polygon);
	}
}
 

Marco13

Top Contributor
Es funktioniert richtig. Es funktioniert vielleicht nicht wie gewünscht, aber es funktioniert "richtig" in bezug auf die Definiton aus Shape (Java Platform SE 6) :

Definition of insideness: A point is considered to lie inside a Shape if and only if:
  • it lies completely inside theShape boundary or
  • it lies exactly on the Shape boundary and the space immediately adjacent to the point in the increasing X direction is entirely inside the boundary or
  • it lies exactly on a horizontal boundary segment and the space immediately adjacent to the point in the increasing Y direction is inside the boundary.

Was hier grob so viel heißt wie "der linke obere Rand ist 'innen', der rechte untere aber nicht".

Wenn es nur um Rechtecke geht (wie in diesem Fall) ist die Lösung recht einfach, da kann man sich eine triviale Hilfsmethode dafür basteln - dann könnte man aber ggf. gleich ein "Rectangle" verwenden. Wenn du wirklich ein Polygon brauchst, und dessen Definition von "inside" ändern möchtest, könnte das ein bißchen fummeliger werden. Dann würde mir jetzt nichts anderes einfallen, alls die existierende "contains"-Methode durchzusehen, und zu schauen, ob es reicht, an einigen Stellen Abfragen wie "x<xMax" durch "x<=xMax" zu ersetzen. Es gibt evtl. einige Fälle, wo das nicht ganz so einfach ist, aber ... wäre ein erster Ansatz, und einen Versuch wert...
 

Rene_Meinhardt

Mitglied
vielen dank für die schnelle antwort. es war meine befürchtung, dass ich für meine belange die contains() methode umschreiben muss, aber da ich nur konvexe polygone habe, wird das wohl nicht so schwer sein.
 

Marco13

Top Contributor
Ein Alternativansatz wäre für einige Fälle vielleicht, das Polygon "nach rechts unten hin einen Pixel größer zu machen", aber das wäre (bei nicht-Rechtecken, und auch schon bei "nur" konvexen Polygonen) ziemlich diffizil, frickelig, und sicher nicht so sauber umsetzbar wie eine spezielle contains-Methode...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Polygon contains - Erläuterung Java Basics - Anfänger-Themen 3
K Methoden contains()-Methode für Punkt in Polygon Java Basics - Anfänger-Themen 5
T Polygon.contains Fehler Java Basics - Anfänger-Themen 2
B Objete von Polygon mit TreeSet verwalten Java Basics - Anfänger-Themen 1
I Vererbung Polygon erweitern ? Java Basics - Anfänger-Themen 4
F Polygon vergrößern Java Basics - Anfänger-Themen 8
K draw Polyline will nicht wie Polygon Java Basics - Anfänger-Themen 2
S Speicherbedarf Pixel vs. Polygon? Java Basics - Anfänger-Themen 7
M Polygon umkreisen? Java Basics - Anfänger-Themen 47
R Polygon erweitern Java Basics - Anfänger-Themen 10
M Polygon Punkte im Uhrzeigersinn sortieren Java Basics - Anfänger-Themen 2
G Polygon in Frame zeichnen Java Basics - Anfänger-Themen 3
E Polygon und Polyline Java Basics - Anfänger-Themen 30
K Polygon Java Basics - Anfänger-Themen 14
C Polygon um Figur bestimmen Java Basics - Anfänger-Themen 10
K Polygon in Java3D (Java 3D) zeichnen Java Basics - Anfänger-Themen 4
0 problem beim Polygon zeichnen Java Basics - Anfänger-Themen 3
G bild in polygon zeichnen Java Basics - Anfänger-Themen 6
G Polygon Java Basics - Anfänger-Themen 7
I drehendes polygon Java Basics - Anfänger-Themen 4
A Checkstyle - File contains tab characters Java Basics - Anfänger-Themen 2
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
R contains ist case-intrensive Java Basics - Anfänger-Themen 7
I Methoden List.contains() beim 2. Element = true Java Basics - Anfänger-Themen 1
B String: Groß- und Kleinschreibung ignorieren bei Contains? Java Basics - Anfänger-Themen 2
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
L String überprüfen mit .equals .contains oder .matches? Java Basics - Anfänger-Themen 1
G String nach Contains/Regex Java Basics - Anfänger-Themen 2
J Datentypen Anwendung von String contains Java Basics - Anfänger-Themen 4
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
I set contains false Java Basics - Anfänger-Themen 11
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
S Methode contains beim String Java Basics - Anfänger-Themen 2
A contains bzw. indexOf liefert keine Treffer? Java Basics - Anfänger-Themen 3
L String.contains() - substring erstellen Java Basics - Anfänger-Themen 3
D Problem mit string.equals bzw string.contains Java Basics - Anfänger-Themen 4
G NetBeans Contains files with errors Java Basics - Anfänger-Themen 14
D String contains CharSequence? Java Basics - Anfänger-Themen 3
S Hexstring contains & split Java Basics - Anfänger-Themen 2
R Collections Probleme mit contains()-Methode [LinkedList] Java Basics - Anfänger-Themen 5
Z Fehler bei .contains auf Double Liste Java Basics - Anfänger-Themen 4
C Datentypen Probleme mit Vector.contains() Java Basics - Anfänger-Themen 10
DasBrot Datentypen HashSet contains() Java Basics - Anfänger-Themen 3
R Datentypen Problem mit Contains bei String[] Java Basics - Anfänger-Themen 4
M HashSet.contains() Java Basics - Anfänger-Themen 2
A ArrayList<T>: Problem mit contains() bei parametrisiertem T Java Basics - Anfänger-Themen 6
H contains (für LIST) funktioniert nicht - ich weiß nicht warum? Java Basics - Anfänger-Themen 7
B String contains.("") Java Basics - Anfänger-Themen 3
K ArrayList contains()-Methode Java Basics - Anfänger-Themen 10
G Erzeugung eines Dreiecks und die contains Methode Java Basics - Anfänger-Themen 2
R Vector mit contains abfragen Java Basics - Anfänger-Themen 32
H Strings suchen mit der Hilfe von "contains" Java Basics - Anfänger-Themen 6
D ArrayList contains mit Wildcard Java Basics - Anfänger-Themen 3
K public boolean contains (Object obj) > true or false Java Basics - Anfänger-Themen 16
M Fehlermeldung (The method contains(String) is. Java Basics - Anfänger-Themen 3
lin Kommandozeile bzw. if(cl.contains("xy")) { //do } Java Basics - Anfänger-Themen 7
S wie wende ich "contains(CharSequence s)" auf mein Java Basics - Anfänger-Themen 3
G contains - Punkt in Kreis enthalten? Java Basics - Anfänger-Themen 6
D contains bei JTextArea anstatt bei JTextField Java Basics - Anfänger-Themen 8
S Text eines JTextField mit contains überprüfen Java Basics - Anfänger-Themen 12
J Datenüberwachung funktioniert nicht Java Basics - Anfänger-Themen 9
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
J .jar datei öffnen funktioniert nicht Java Basics - Anfänger-Themen 17
G Mit jPackage erstellte EXE funktioniert nicht Java Basics - Anfänger-Themen 2
G Robot funktioniert nicht bei SelectionListener Java Basics - Anfänger-Themen 6
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
monsterherz Punkt Notation funktioniert nicht Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
ms_cikar Bin to Float convertieren funktioniert nicht Java Basics - Anfänger-Themen 24
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
Garrit1994 Continue funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
B Methoden Übergebe Variabel funktioniert nicht Java Basics - Anfänger-Themen 17
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
Agent4nobody Programmstart durch aufruf des interpreters funktioniert nicht Java Basics - Anfänger-Themen 14
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
U Wie genau funktioniert der ! Operator Java Basics - Anfänger-Themen 3
stormyark 4 Bit in einer for-schleife funktioniert nicht Java Basics - Anfänger-Themen 3
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
M Java printf(Locale.... funktioniert nicht Java Basics - Anfänger-Themen 3
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
districon Backtracking funktioniert nicht ganz Java Basics - Anfänger-Themen 3
H Array rückwärts auslesen funktioniert nicht Java Basics - Anfänger-Themen 3
S Math.random funktioniert nicht Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben