迭代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(); }
- 如何编写generics方法来查找最大元素并调用该方法?
- 使用gradle“run”任务运行main方法
- Spring + Hibernate会话生命周期
- 我得到的资源不在项目的构建路径上
- 如何在java中的JTextField中停止输入后启动一个函数
- GC中的GC.AddMemoryPressure等效
- 如何使用Google Guava的Throwables.propagateIfInstanceOf()?
- 如何以二进制格式发送Java对象并在C服务器中接收?
- 无法使用Java 8中的DateTimeFormatter和ZonedDateTime从TemporalAccessor获取ZonedDateTime