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

在java中迭代行/路径上的每个点,java,path,iterator,line,point,Java,Path,Iterator,Line,Point,我不熟悉使用迭代器,想知道如何迭代线段上的每个点(确切地说是Line2D.Double)——我需要检查线段上的每个点是否满足某些要求 另外,给定一个路径对象(如GeneralPath),您将如何执行相同的操作(迭代形状轮廓上的每个点) 理想情况下,我想要这样的东西(带有线条或路径): 尽管您的问题缺少很多相关信息(即我对您的类猜了很多),但最干净的循环代码是foreach语法: GeneralPath path = ...; for (Line2D.Double point : path.get

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

另外,给定一个路径对象(如GeneralPath),您将如何执行相同的操作(迭代形状轮廓上的每个点)

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


尽管您的问题缺少很多相关信息(即我对您的类猜了很多),但最干净的循环代码是
foreach
语法:

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

但是请注意,您不能使用这种循环修改正在迭代的对象

检查返回的类型:

  • pathierator.SEG\u MOVETO
  • PathIterator.SEG\u LINETO
  • PathIterator.SEG_QUADTO
  • pathierator.SEG\u CUBICTO
  • pathierator.SEG\u CLOSE
代码:


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

使用FlattingPathIterator传递形状的路径迭代器来实现循环。

Java API中似乎没有任何东西可以让Bresenham的算法用户可见

您可以这样使用它:

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]]"));
List points=new ArrayList();
Line2D line=新的Line2D.Double(0,0,8,4);
点2D电流;
for(Iterator it=newlineiterator(line);it.hasNext();){
当前=it.next();
点数。添加(当前);
}
assertThat(points.toString(),
是(“[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]]”);

我正在寻找与foreach循环几乎完全相同的方法,但我只是尝试了一下,GeneralPath没有名为getPoints()的方法(Line2D也没有)。。。另外,我不想在参数中为(Point2D…)而不是Line2D做点什么吗?但是,(从我对迭代器的有限理解来看)这不就是给我路径每一段的起点/终点,而不是路径上的每一个点吗?你是对的,但是在一条线上,你可以得到无限数量的点。所以,如果你得到一条线段的起点和终点,为什么不根据你想要的精度来计算自己呢?编辑:我误解了你的问题,看前面的注释就足够了,记住两点形式,你可以自己得到坐标//我认为您可以先使用Line2D.Double(双X1、双Y1、双X2、双Y2)创建Line2D,然后使用Line2D方法contains(双x、双y)检查点是否在线上这可能是真的,也可能不是真的。Escapa分析风格的优化使得每次都不必创建新对象。投票结果仍然很好,因为这是唯一一个至少有点道理的答案。没错,JVM可以“优化”对象。非常感谢,伙计,你的逻辑让所有点都处于在线状态非常好。这对我来说非常有效。谢谢!你救了我几个小时!链接似乎过时了。你能更新它或提供代码作为你答案的一部分吗?
PathIterator pi = path.getPathIterator(null);

while (pi.isDone() == false) {
    double[] coordinates = new double[6];
    int type = pi.currentSegment(coordinates);
    pi.next();
}
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]]"));