перебрать каждую точку на линии / пути в Java - PullRequest
4 голосов
/ 14 июня 2011

Я новичок в использовании итераторов, и мне было интересно, как можно проходить через каждую точку отрезка (Line2D.Double, если быть точным) - мне нужно проверить, соответствует ли каждая точка на линии определенным требованиям. .

Кроме того, учитывая объект пути (например, GeneralPath), как бы вы делали то же самое (итерацию по каждой точке контура фигуры)?

В идеале я бы хотел что-то вроде этого (с линией или путем):

Line2D line = new Line2D.Double(p1,p2);
for (Point2D point : line)
{
   point.callSomeMethod();
}

Ответы [ 5 ]

8 голосов
/ 07 апреля 2012

Кажется, в Java API нет ничего, что делало бы алгоритм Брезенхэма видимым для пользователя. Итак, я написал класс, который перебирает строку.

Вы можете использовать его так:

List<Point2D> points = new ArrayList<Point2D>();
Line2D line = new Line2D.Double(0, 0, 8, 4);
Point2D current;

for (Iterator<Point2D> it = new LineIterator(line); it.hasNext();) {
    current = it.next();
    points.add(current);
}

assertThat(points.toString(), 
    is("[Point2D.Double[0.0, 0.0], Point2D.Double[1.0, 0.0], " +
        "Point2D.Double[2.0, 1.0], Point2D.Double[3.0, 1.0], " +
        "Point2D.Double[4.0, 2.0], Point2D.Double[5.0, 2.0], " +
        "Point2D.Double[6.0, 3.0], Point2D.Double[7.0, 3.0], " +
        "Point2D.Double[8.0, 4.0]]"));
1 голос
/ 14 июня 2011

Это будет медленно, потому что это будет генерировать новый объект для каждой точки. Если вам нужно более быстрое решение, вы можете сами попытаться реализовать цикл, используя алгоритм Брезенхама .

0 голосов
/ 14 июня 2011

Используйте FlateningPathIterator, передавая итератор пути Shape.

0 голосов
/ 14 июня 2011

Проверьте возвращаемый тип:

  • PathIterator.SEG_MOVETO
  • PathIterator.SEG_LINETO
  • PathIterator.SEG_QUADTO
  • PathIterator.SEG_CUBICTO
  • PathIterator.SEG_CLOSE

Код:

PathIterator pi = path.getPathIterator(null);

while (pi.isDone() == false) {
    double[] coordinates = new double[6];
    int type = pi.currentSegment(coordinates);
    pi.next();
}
0 голосов
/ 14 июня 2011

Хотя в вашем вопросе отсутствует много релевантной информации (т. Е. Я много думаю о ваших классах), самый чистый код цикла - это синтаксис foreach:

GeneralPath path = ...;
for (Line2D.Double point : path.getPoints()) {
    // do something
}

Обратите внимание, что вы не можете модифицировать объект, повторяемый с помощью этого вида цикла.

...