Ich war erstaunt zu erfahren, dass die closePath
Methode von Java Path2D.Float
nicht wirklich den Pfad korrekt schließt. Der folgende Code:Java Path2D.closePath funktioniert nicht richtig?
Path2D.Float p = new Path2D.Float();
p.moveTo(3, 3);
p.lineTo(10, 3);
p.lineTo(8, 5);
p.closePath();
PathIterator it = p.getPathIterator(null);
float lastx = 0;
float lasty = 0;
boolean first = true;
while (it.isDone() == false) {
float[] coordinates = new float[2];
int type = it.currentSegment(coordinates);
if (first) {
first = false;
} else {
System.out.println("Segment from "+lastx+", "+lasty+" to "+coordinates[0]+", "+coordinates[1]);
}
lastx = coordinates[0];
lasty = coordinates[1];
it.next();
}
erzeugt diese Ausgabe:
Segment from 3.0, 3.0 to 10.0, 3.0
Segment from 10.0, 3.0 to 8.0, 5.0
Segment from 8.0, 5.0 to 0.0, 0.0
Allerdings würde man closePath
erwarten den Pfad zu schließen 3, 3
Koordinaten, wie es in der Dokumentation heißt es:
Closes den aktuellen Unterpfad durch Zeichnen einer geraden Linie zurück zu den Koordinaten des letzten moveTo. Wenn der Pfad bereits geschlossen ist, hat diese Methode keine Wirkung. (https://docs.oracle.com/javase/8/docs/api/java/awt/geom/Path2D.html#closePath--)
Ersetzen closePath
durch lineTo
auf die Startkoordinaten die gewünschten Segmente erzeugt jedoch der Segmenttyp des letzten Segments auf diese Weise nicht gleich SEG_CLOSE
: (https://docs.oracle.com/javase/8/docs/api/java/awt/geom/PathIterator.html)
Type: 0 // SEG_MOVETO
Type: 1 // SEG_LINETO
Segment from 3.0, 3.0 to 10.0, 3.0
Type: 1
Segment from 10.0, 3.0 to 8.0, 5.0
Type: 1
Segment from 8.0, 5.0 to 3.0, 3.0
Anfügen ein weiterer closePath
Aufruf führt wieder zu falschen Ergebnissen:
Type: 0
Type: 1
Segment from 3.0, 3.0 to 10.0, 3.0
Type: 1
Segment from 10.0, 3.0 to 8.0, 5.0
Type: 1
Segment from 8.0, 5.0 to 3.0, 3.0
Type: 4 // SEG_CLOSE
Segment from 3.0, 3.0 to 0.0, 0.0 // <- not the correct coordinates!
Kann jemand dies reproduzieren, oder anderweitig erklären, was ich vermisse, wenn das kein Fehler ist?
Zusätzliche Informationen: Betriebssystem: Mac OS X 10.10.5 JDK: jdk1.8.0_92
Mit freundlichen Grüßen
Ich nehme an, dass es auch falsch zeichnet? – Ironcache
Sehen Sie sich den 'PathIterator' Javadoc an und Sie erhalten Ihre Antwort.Wenn das zurückgegebene int gleich SEG_CLOSE ist, werden keine Punkte in das Array geschrieben (daher kommt [0.0, 0.0], die Standard-Float-Werte, zurück, wie Sie bemerken und wie erwartet). Um das Problem zu beheben, überprüfen Sie den int-Rückgabetyp von 'currentSegment()' https://docs.oracle.com/javase/8/docs/api/java/awt/geom/PathIterator.html – Ironcache
ich sehe. Ich weiß nichts über die Zeichnung (aber @Boann schlägt vor, dass es in Ordnung sein wird), weil ich den Pfad nicht zum Zeichnen verwende. Ich verwende es einfach, um zu testen, ob Punkte in dem Bereich mit dem Pfad als Form enthalten sind oder nicht. – Warkst