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
循环中如何递增以沿着形状的路径移动对象?
答案 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_LINETO
,SEG_QUADTO
和SEG_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_LINETO
和coord[0]
才有效。这似乎是一个安全的假设,因为coord[1]
(在链接文本中显示,而不是问题文本)不应该返回弯曲的段。但是,它还包含一个更危险的假设,即FlatteningPathIterator
段永远不会出现,它有0坐标,可能导致垃圾破坏生成的SEG_CLOSE
列表。
更好的代码可能更像是:
points
答案 1 :(得分:1)
(对于上下文)iter
是FlatteningPathIterator
的一个实例(这对于解释所有iter
次调用非常重要!)
float[] coords=new float[6];
使用6个索引初始化一个新的float
数组,默认值为(0.0f)
while (!iter.isDone()) {
...
iter.next();
}
此处iter
是PathIterator
个实例。因此iter.next()
将迭代器指针移动到迭代器中的下一个项目,iter.isDone()
检查迭代器中是否还有任何内容。
最后,iter.currentSegment(coords);
将当前迭代器段的内容加载到coords
数组。