遍历java中线/路径上的每个点

| 我是使用迭代器的新手,并且想知道如何迭代线段上的每个点(准确地说,是Line2D.Double)-我需要检查该行上的每个点是否满足某些要求。 另外,给定路径对象(如GeneralPath),您将如何做同样的事情(遍历形状轮廓上的每个点)? 理想情况下,我想要这样的东西(用直线或路径):
Line2D line = new Line2D.Double(p1,p2);
for (Point2D point : line)
{
   point.callSomeMethod();
}
    
已邀请:
        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]]\"));
    
        这将很慢,因为它将为每个点生成一个新对象。如果需要更快的解决方案,则可能需要考虑使用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();
}
    

要回复问题请先登录注册