我是新手使用迭代器,并且想知道如何迭代线段上的每个点(Line2D.Double,确切地说) - 我需要检查线上的每个点是否满足某些要求
另外,给定一个路径对象(如GeneralPath),你会如何做同样的事情(遍历形状轮廓上的每个点)?
理想情况下,我喜欢这样的东西(有一条线或一条路径):
Line2D line = new Line2D.Double(p1,p2);
for (Point2D point : line)
{
point.callSomeMethod();
}
答案 0 :(得分:8)
Java API中似乎没有任何东西可以让Bresenham的算法用户可见。 So I wrote a class that iterates over a line.
你可以像这样使用它:
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 :(得分:1)
这会很慢,因为它会为每个点生成一个新对象。如果您需要更快的解决方案,您可能希望自己使用Bresenham algorithm来实现循环。
答案 2 :(得分:0)
虽然你的问题缺少很多相关信息(即我猜你的类很多),最干净的循环代码是foreach
语法:
GeneralPath path = ...;
for (Line2D.Double point : path.getPoints()) {
// do something
}
但请注意,您无法使用此类循环修改正在迭代的对象。
答案 3 :(得分:0)
检查返回的类型:
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();
}
答案 4 :(得分:0)
使用FlatteningPathIterator传递Shape的路径迭代器。