迭代java中一行/路径上的每个点

我是新手使用迭代器,并想知道如何迭代线段上的每个点(Line2D.Double,确切地说) – 我需要检查线上的每个点是否满足某些要求。

另外,给定一个路径对象(如GeneralPath),你会如何做同样的事情(遍历形状轮廓上的每个点)?

理想情况下,我喜欢这样的东西(有一条线或一条路径):

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

Java API中似乎没有任何东西可以让Bresenham的算法用户可见。 所以我写了一个迭代一行的类。

你可以像这样使用它:

 List points = new ArrayList(); Line2D line = new Line2D.Double(0, 0, 8, 4); Point2D current; for (Iterator 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]]")); 

这将很慢,因为它将为每个点生成一个新对象。 如果您需要更快的解决方案,您可能希望使用Bresenham算法自己实现循环。

虽然你的问题缺少很多相关信息(即我猜你的类很多),但最干净的循环代码是foreach语法:

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

但请注意,您无法使用此类循环修改正在迭代的对象。

使用FlatteningPathIterator传递Shape的路径迭代器。

检查返回的类型:

  • 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(); }