繁体   English   中英

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

[英]iterate through each point on a line/path in java

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

此外,给定一条路径 object(如 GeneralPath),您将如何做同样的事情(遍历形状轮廓上的每个点)?

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

Line2D line = new Line2D.Double(p1,p2);
for (Point2D point : line)
{
   point.callSomeMethod();
}

Java API 中似乎没有任何内容可以使 Bresenham 的算法对用户可见。 所以我写了一个 class 迭代一行。

你可以像这样使用它:

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]]"));

这会很慢,因为它会为每个点生成一个新的 object。 如果您需要更快的解决方案,您可能需要考虑使用Bresenham 算法自己实现循环。

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

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

但是请注意,您不能修改使用这种循环迭代的 object。

检查返回的类型:

  • 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();
}

使用 FlatteningPathIterator 传递 Shape 的路径迭代器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM