Я был сбит с толку, узнав, что метод closePath
Java Path2D.Float
фактически не закрывает путь правильно. Следующий код:Java Path2D.closePath работает неправильно?
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();
}
производит этот выход:
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
Однако, можно было бы ожидать closePath
, чтобы закрыть путь к координатам 3, 3
, как говорится в документации:
Закрывает текущий подпуть, вычерчивая прямую линию обратно в координаты последнего перемещения.. Если путь уже закрыт, этот метод не действует. (https://docs.oracle.com/javase/8/docs/api/java/awt/geom/Path2D.html#closePath--)
Замена closePath
от lineTo
к исходным координатам производят желаемые сегменты, однако типа сегмента последнего сегмента таким образом, не равно 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
добавляющих другой closePath
звонок снова дает неправильные результаты:
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!
Может ли кто-нибудь воспроизвести это или объяснить другим, что мне не хватает, если это не ошибка?
Дополнительная информация: ОС: Mac OS X 10.10.5 JDK: jdk1.8.0_92
Сердечные приветы
Я полагаю, что это также неправильно рисуется? – Ironcache
Посмотрите на Javadoc 'PathIterator', и у вас будет ваш ответ.Подводя итог, если возвращаемый int равен SEG_CLOSE, в массив не помещаются точки (следовательно, [0.0, 0.0], значения поплавков по умолчанию возвращаются, как вы заметили и как ожидается). Поэтому, чтобы устранить проблему, проверьте тип возвращаемого типа 'currentSegment()' https://docs.oracle.com/javase/8/docs/api/java/awt/geom/PathIterator.html – Ironcache
. Я не знаю о чертеже (но @Boann предлагает, что все будет хорошо), потому что я не использую путь для рисования. Я просто использую его для проверки наличия или отсутствия точек в области с контуром как формой. – Warkst