gpt4 book ai didi

java - PathIterator 中 while 循环的功能是什么?

转载 作者:行者123 更新时间:2023-11-30 06:48:32 25 4
gpt4 key购买 nike

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 循环中递增以沿着形状的路径移动对象?

最佳答案

一个路径由多个段定义,可以是:

  • 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,最后是 SEG_CLOSE

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

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

更好的代码可能更像是:

float[] coords = new float[6];
while(!iter.done()) {
int type = iter.currentSegment(coords);
if (type == SEG_MOVETO || type == SEG_LINETO) {
int x = (int) coords[0];
int y = (int) coords[1];
points.add(new Point(x,y));
} else if (type == SEG_CLOSE) {
// Handling sub-path closing here
}
iter.next();
}

关于java - PathIterator 中 while 循环的功能是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44165409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com