PathIterator中的while循环函数是什么?

时间:2017-05-24 17:51:34

标签: java

http://java-sl.com/tip_flatteningpathiterator_moving_shape.html

尝试在上面的链接中学习此代码,但我无法理解以下代码:

    float[] coords=new float[6];
    while (!iter.isDone()) {
        iter.currentSegment(coords);
        int x=(int)coords[0];
        int y=(int)coords[1];
        points.add(new Point(x,y));
        iter.next();
    }

float数组的目的是什么,为什么有6个,以及while循环中如何递增以沿着形状的路径移动对象?

2 个答案:

答案 0 :(得分:3)

Path由多个细分定义,可以是:

  • SEG_CLOSE(0坐标)
  • SEG_MOVETO(2坐标:x,y)
  • SEG_LINETO(2坐标:x,y)
  • SEG_QUADTO(4坐标:x1,y1,x2,y2)
  • SEG_CUBICTO(6坐标:x1,y1,x2,y2,x3,y3)

SEG_LINETOSEG_QUADTOSEG_CUBICTO段也有一个隐含的起点:上一段的结尾)

例如,可以通过以下方式创建三角形:

GeneralPath path = new GeneralPath();
path.moveTo(10, 10);
path.lineTo(15, 20);
path.lineTo(20,  8);
path.close();

while(!iter.done()) { }循环依次处理路径的每个段,从SEG_MOVETO开始,然后是SEG_LINETO,第二个SEG_LINETO,最后是{{1 }}

SEG_CLOSE数组用作临时存储,用于coords[]调用的输出。临时存储阵列将被覆盖,而不是在返回时为每个段分配存储空间。由于“立方”段需要3个点(6个坐标),因此数组大小必须至少为6。

您发布的代码包含一个隐含的假设 - 仅存在currentSegment() / SEG_MOVETO类型细分,因此只有SEG_LINETOcoord[0]才有效。这似乎是一个安全的假设,因为coord[1](在链接文本中显示,而不是问题文本)不应该返回弯曲的段。但是,它还包含一个更危险的假设,即FlatteningPathIterator段永远不会出现,它有0坐标,可能导致垃圾破坏生成的SEG_CLOSE列表。

更好的代码可能更像是:

points

答案 1 :(得分:1)

(对于上下文)iterFlatteningPathIterator的一个实例(这对于解释所有iter次调用非常重要!)

float[] coords=new float[6];使用6个索引初始化一个新的float数组,默认值为(0.0f)

   while (!iter.isDone()) {
        ...
        iter.next();
    }

此处iterPathIterator个实例。因此iter.next()将迭代器指针移动到迭代器中的下一个项目,iter.isDone()检查迭代器中是否还有任何内容。

最后,iter.currentSegment(coords);将当前迭代器段的内容加载到coords数组。