Wie funktioniert contains() für Path2D.Double

CptK

Bekanntes Mitglied
Hallo, ich habe eine Path2D.Double line, der folgendermaßen gezeichnet wird:
Java:
line = new Path2D.Double();
line.moveTo(origin.x, origin.y);
line.curveTo(origin.x, origin.y, anchor.x, anchor.y, destination.x, destination.y);
line.moveTo(destination.x, destination.y);
line.closePath();

Graphics2D g2 = (Graphics2D) g;
g2.draw(line);

Nun habe ich noch einen Methode onClick(), die ausgeführt wird, wenn geklickt wird. In dieser soll überprüft werden, ob der geklickte Punkt auf der Linie liegt:
Java:
public void onClick(int x, int y) {
    if(line.contains(x, y)) {
        ....
    }
}
Allerdings liefert der Test von contains() immer false, selbst wenn ich ihn mit einem der Punkte aufrufe, mit denen ich die Linie gezeichnet habe. Wie verwendet man das richtig, so dass es auch funktioniert?
 

Blender3D

Top Contributor
Nun habe ich noch einen Methode onClick(), die ausgeführt wird, wenn geklickt wird. In dieser soll überprüft werden, ob der geklickte Punkt auf der Linie liegt:
contains überprüft ob sich der angegebene Punkt innerhalb des Polygons ,das durch den Pfad erzeugt wird, befindet.
Das setzt voraus, dass der Pfad geschlossen ist. Außerdem muss man auf die Reihenfolge der Punkte aufpassen. Z.B. 4 Punkte erzeugen in der richtigen Reihenfolge ein Rechteck. Andernfalls erhält man eine Form wo sich Linien kreuzen.
 

CptK

Bekanntes Mitglied
contains überprüft ob sich der angegebene Punkt innerhalb des Polygons ,das durch den Pfad erzeugt wird, befindet.
Das setzt voraus, dass der Pfad geschlossen ist. Außerdem muss man auf die Reihenfolge der Punkte aufpassen. Z.B. 4 Punkte erzeugen in der richtigen Reihenfolge ein Rechteck. Andernfalls erhält man eine Form wo sich Linien kreuzen.
hm okay also das Zeichnen funktioniert ja einwandfrei, und ich möchte ja nur diese eine Linie haben. Muss ich dann die gleiche Linie noch mal zurück zeichnen also ungefähr so:
Java:
line.moveTo(origin.x, origin.y);
line.curveTo(origin.x, origin.y, anchor.x, anchor.y, destination.x, destination.y);
line.moveTo(destination.x, destination.y);
line.curveTo(destination.x, destination.y, anchor.x, anchor.y, origin.x, origin.y);
line.closePath();
 

mihe7

Top Contributor
Der Pfad muss nicht geschlossen sein.
Code:
jshell> var path = new Path2D.Double();
path ==> java.awt.geom.Path2D$Double@7740a2

jshell> path.moveTo(10, 10)

jshell> path.lineTo(20, 10)

jshell> path.lineTo(20, 0)

jshell> path.contains(5, 5)
$36 ==> false

jshell> path.contains(15, 5)
$37 ==> true
 

CptK

Bekanntes Mitglied
Das mit dem contains() hat bei mir ja irgendwie nicht funktioniert, ich habe das jetzt so gelöst:
Java:
public boolean isClicked(int x, int y) {
    final int HIT_BOX_SIZE = 20;
    int boxX = x - HIT_BOX_SIZE / 2;
    int boxY = y - HIT_BOX_SIZE / 2;

    int width = HIT_BOX_SIZE;
    int height = HIT_BOX_SIZE;
    return line.intersects(boxX, boxY, width, height);
}
 

mihe7

Top Contributor
Das mit dem contains() hat bei mir ja irgendwie nicht funktioniert, ich habe das jetzt so gelöst:
Ja, das sieht gut aus. contains() prüft, ob der angegebene Punkt Teil der Fläche ist, die durch den Pfad begrenzt wird (nach festgelegten Regeln). Du willst eigentlich prüfen, ob ein Punkt auf dem Pfad selbst liegt. Das ist m. E. nicht unmittelbar möglich, aber über ein Rechteck, das den angeklickten Punkt umgibt, wirst Du einen Schnittpunkt mit dem Innern finden.
 

CptK

Bekanntes Mitglied
Ich habe jetzt noch eine weiterführende Frage:
Ich habe nun ein Objekt, dass ich dann um einen gewissen Winkel rotiere:
Java:
AffineTransform old = g2.getTransform();
g2.rotate(Math.toRadians(rotationAngle), from.x(), from.y());
line.moveTo(from.x(), from.y());
line.curveTo(from.x(), from.y(), anchor.x - 40, anchor.y + 10, anchor.x, anchor.y);
line.moveTo(anchor.x, anchor.y);
line.curveTo(anchor.x, anchor.y, anchor.x + 40, anchor.y + 10, to.x(), to.y());
line.moveTo(to.x(), to.y());
line.closePath();
g2.drawString(String.valueOf(letter), anchor.x - 2, anchor.y - 5);
g2.draw(line);
g2.setTransform(old);

Wenn ich jetzt aber meine Schnittberechnung darauf anwende, funktioniert das logischerweise nicht, weil das Objekt an sich ja nicht rotiert ist, sondern nur die Zeichnung. Wie mache ich das, dass meine Schnitt-Erkennung auch mit der rotierten Zeichnung umgehen kann?
Im Prinzip wäre es doch am einfachsten, das Viereck, mit dem ich vergleiche, mit dem gleichen Winkel um den gleichen Mittelpunkt zu rotieren und dann abzugleichen richtig? Jetzt komme ich nur nicht auf eine Abbildung, mit der das gelingt..
 

mihe7

Top Contributor
Vermutlich irgendwas wie
Java:
AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), from.x(), from.y());
Shape rotated = at.createTransformedShape(rectangle);
line.intersects(rotated);
Wobei der Winkel entgegengesetzt sein müsste.
 

CptK

Bekanntes Mitglied
Vermutlich irgendwas wie
Java:
AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(rotationAngle), from.x(), from.y());
Shape rotated = at.createTransformedShape(rectangle);
line.intersects(rotated);
Wobei der Winkel entgegengesetzt sein müsste.

Java:
final int HIT_BOX_SIZE = 10;
Rectangle2D rectangle = new Rectangle(x - HIT_BOX_SIZE / 2, y - HIT_BOX_SIZE / 2, HIT_BOX_SIZE, HIT_BOX_SIZE);
AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(360 - rotationAngle), from.x(),from.y());
Shape rotated = at.createTransformedShape(rectangle);
return line.intersects(rotated);
Ich kann intersects() nicht mit einem aktualen Parameter vom typ Shape aufrufen und Shape kann man auch nicht zu Rectangle2D casten. Ich finde keine Lösung, mit der das funktioniert
 
Zuletzt bearbeitet:

CptK

Bekanntes Mitglied
Java:
final int HIT_BOX_SIZE = 10;
Rectangle2D rectangle = new Rectangle(x - HIT_BOX_SIZE / 2, y - HIT_BOX_SIZE / 2, HIT_BOX_SIZE, HIT_BOX_SIZE);
AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(360 - rotationAngle), from.x(),from.y());
Shape rotated = at.createTransformedShape(rectangle);
return line.intersects(rotated);
Ich kann intersects() nicht mit einem aktualen Parameter vom typ Shape aufrufen und Shape kann man auch nicht zu Rectangle2D casten. Ich finde keine Lösung, mit der das funktioniert
Habs:
Java:
return line.intersects(rotated.getBounds2D());
 

CptK

Bekanntes Mitglied
Diese Linien machen mich noch wahnsinnig.... Ich habe ein Problem:
Die Linien gehen vom Mittelpunkt eines Kreises zum Mittelpunk eines anderen Kreisen und laufen über einen Ankerpunkt. Wenn ich diesen Ankerpunkt jetzt verschiebe, laufen die Linien nicht mehr durch den Ankerpunkt, sondern daneben, wodurch sich 2 Probleme ergeben:
1. Die Pfeilspitzen am Ende der Linie passen nicht mehr richtig
2. Ich nutze den Anker auch, um eine Position für eine Beschriftung zu finden, allerdings ist diese dann sehr weit von der Linie entfernt

Hier einmal ein Bild von dem, was ich meine:
1616534857454.png

Hier nochmal der Code wie ich die Line rotiere:
Java:
AffineTransform old = g2.getTransform();
g2.rotate(Math.toRadians(rotationAngle), from.x(), from.y());
line.moveTo(from.x(), from.y());
line.curveTo(from.x(), from.y(), anchor.x - 40, anchor.y + 10, anchor.x, anchor.y);
line.moveTo(anchor.x, anchor.y);
line.curveTo(anchor.x, anchor.y, anchor.x + 40, anchor.y + 10, to.x(), to.y());
line.moveTo(to.x(), to.y());
line.closePath();
g2.drawString(String.valueOf(letter), anchor.x - 2, anchor.y - 5);
g2.draw(line);
g2.setTransform(old);

Hat da jemand einen Tipp, wie ich das besser lösen könnte?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin if Abfrage funktioniert nicht richtig AWT, Swing, JavaFX & SWT 10
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
M Scrollbar funktioniert nicht AWT, Swing, JavaFX & SWT 10
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H Swing Anpassen der Textgröße im JLabel funktioniert nur bedingt AWT, Swing, JavaFX & SWT 7
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Swing Tooltip-Delay funktioniert nicht immer. AWT, Swing, JavaFX & SWT 1
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
U Wie funktioniert das rotieren unter 2dGraphics, also wie stelle ich z. B. 90° ein? AWT, Swing, JavaFX & SWT 1
U Wie funktioniert Polygon? AWT, Swing, JavaFX & SWT 1
U Wie genau funktioniert 2dgraphics, in diesem Bezug? AWT, Swing, JavaFX & SWT 4
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
H RPG Programmieren, label.setLocation funktioniert nicht AWT, Swing, JavaFX & SWT 7
EinNickname9 Einfacher parser funktioniert nicht AWT, Swing, JavaFX & SWT 2
F Swing Adapt Row Height funktioniert nicht richtig :( AWT, Swing, JavaFX & SWT 7
P Swing jxmapviewer hinzufügen/nutzen funktioniert nicht AWT, Swing, JavaFX & SWT 7
J Anbindung Textfeldklasse an Table funktioniert nicht AWT, Swing, JavaFX & SWT 3
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
VPChief Swing Eclipse: Nach Exportieren, Button funktioniert nicht mehr AWT, Swing, JavaFX & SWT 26
H Bewegung funktioniert nicht AWT, Swing, JavaFX & SWT 3
N Pixelfarbe abgleichen funktioniert nicht AWT, Swing, JavaFX & SWT 5
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
N eclipse Java, bilder benutzten Funktioniert nicht AWT, Swing, JavaFX & SWT 6
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
steven789hjk543 Swing Weiß jemand, warum dieses Programm nicht funktioniert? AWT, Swing, JavaFX & SWT 7
M Swing setMaximumSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
K JavaFX funktioniert nicht AWT, Swing, JavaFX & SWT 2
B AWT actionPerformed Method funktioniert nicht AWT, Swing, JavaFX & SWT 12
L JavaFX Drag and Drop funktioniert nicht AWT, Swing, JavaFX & SWT 3
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
T LookAndFeel LookAndFeel funktioniert nicht beim JFrame wechsel AWT, Swing, JavaFX & SWT 3
J JavaFX addListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
P CardLayout funktioniert fehlerhaft AWT, Swing, JavaFX & SWT 13
L WrapLayout funktioniert nicht AWT, Swing, JavaFX & SWT 1
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
S JavaFX mit javac compilieren funktioniert nicht AWT, Swing, JavaFX & SWT 2
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
J AWT System Farben / java.awt.SystemColor funktioniert nicht AWT, Swing, JavaFX & SWT 4
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
K javafx app > "run in browser" funktioniert nicht AWT, Swing, JavaFX & SWT 3
N JavaFX GridPane Halignment funktioniert nicht AWT, Swing, JavaFX & SWT 1
it_is_all JLabel.setIcon - funktioniert nicht mehr AWT, Swing, JavaFX & SWT 2
R Ausgabe über JOptionPane.showMessageDialog funktioniert nicht AWT, Swing, JavaFX & SWT 2
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
J JTable Selection Listener funktioniert nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z BoxLayout funktioniert nicht und Buttongröße AWT, Swing, JavaFX & SWT 18
C Java Hintergrund funktioniert nicht AWT, Swing, JavaFX & SWT 9
J Swing Wie funktioniert dieser ChangePropertyListener??? AWT, Swing, JavaFX & SWT 0
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
A Swing Programm funktioniert aber zwei Buttons werden angezeigt AWT, Swing, JavaFX & SWT 3
M UIManager funktioniert nicht mit Farben AWT, Swing, JavaFX & SWT 9
M Swing UIManager funktioniert nicht mit Farben AWT, Swing, JavaFX & SWT 0
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
S JavaFX wie funktioniert CSS und javaFX AWT, Swing, JavaFX & SWT 19
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
J JScrollPane funktioniert nicht AWT, Swing, JavaFX & SWT 5
M JavaFX Eventhandler Funktioniert nicht AWT, Swing, JavaFX & SWT 3
Sogomn JavaFX Injektion funktioniert nicht AWT, Swing, JavaFX & SWT 4
Blender3D Swing KeyBoardListener funktioniert nicht unter UBUNTU AWT, Swing, JavaFX & SWT 7
J JavaFX Button funktioniert(nicht) AWT, Swing, JavaFX & SWT 3
J DefaultCloseOperation funktioniert nicht AWT, Swing, JavaFX & SWT 9
F JavaFX ObservableList -- warum funktioniert das so.... AWT, Swing, JavaFX & SWT 3
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
Paul15 Button funktioniert nur einmal AWT, Swing, JavaFX & SWT 9
D Swing Warum erhalte ich keine Ausgabe? Funktioniert der equals-vergleich in actionPeformed nicht richtig? AWT, Swing, JavaFX & SWT 3
H UpdatePolicy wird nicht richtig gesetzt / funktioniert nicht AWT, Swing, JavaFX & SWT 5
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
L Event Handling wie funktioniert .getComponent? AWT, Swing, JavaFX & SWT 1
B JavaFX Scene Builder: resize funktioniert (meist) nicht AWT, Swing, JavaFX & SWT 6
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
D Passwort [Aber mit 3 Versuchen] Funktioniert nicht wie erwartet AWT, Swing, JavaFX & SWT 4
C Applet Applet funktioniert in Eclipse aber nicht in Browser AWT, Swing, JavaFX & SWT 1
J Zellen in JavaFx einfärben funktioniert nicht AWT, Swing, JavaFX & SWT 1
S Swing Warum funktioniert der automatische Zeilenumbruch mit arabischen Zeichen beim JTextPane nicht AWT, Swing, JavaFX & SWT 3
Joew0815 JDialog repaint() funktioniert nicht wie gewünscht. AWT, Swing, JavaFX & SWT 2
C KeyPressed funktioniert auf iOS nicht richtig? AWT, Swing, JavaFX & SWT 4
D Event Handling MouseListener funktioniert seit Java 8 nicht mehr AWT, Swing, JavaFX & SWT 13
M LayoutManager GridLayout funktioniert nicht AWT, Swing, JavaFX & SWT 0
I Objekte aus contentPane löschen funktioniert nicht AWT, Swing, JavaFX & SWT 3
F JavaFX Antialiasing funktioniert nicht? AWT, Swing, JavaFX & SWT 8
F CardLayout.show() funktioniert teilweise nicht AWT, Swing, JavaFX & SWT 5
M Listener funktioniert nicht AWT, Swing, JavaFX & SWT 7
M "Update" der JTable funktioniert nicht AWT, Swing, JavaFX & SWT 2
T JAXB funktioniert ohne IDE nicht verlässlich AWT, Swing, JavaFX & SWT 12
C Repaint() funktioniert nicht in TabbedPanel AWT, Swing, JavaFX & SWT 5
T LayoutManager GridLayout panel.setSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
R JavaFX Stage.close() funktioniert nicht im jar-File AWT, Swing, JavaFX & SWT 2
S Swing JLayeredPane Anordnung funktioniert nicht AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben