获取GeneralPath的有序顶点

时间:2011-04-27 11:12:33

标签: java geometry 2d

如何获取GeneralPath对象的顶点?看起来这应该是可能的,因为路径是由点(lineTo,curveTo等)构成的。

我正在尝试创建双点[] []点数据(x / y坐标数组)。

3 个答案:

答案 0 :(得分:5)

您可以从PathIterator获取积分。

我不确定你的约束是什么,但是如果你的形状总是只有一个封闭的子路径而且只有直边(没有曲线),那么下面的方法就可以了:

static double[][] getPoints(Path2D path) {
    List<double[]> pointList = new ArrayList<double[]>();
    double[] coords = new double[6];
    int numSubPaths = 0;
    for (PathIterator pi = path.getPathIterator(null);
         ! pi.isDone();
         pi.next()) {
        switch (pi.currentSegment(coords)) {
        case PathIterator.SEG_MOVETO:
            pointList.add(Arrays.copyOf(coords, 2));
            ++ numSubPaths;
            break;
        case PathIterator.SEG_LINETO:
            pointList.add(Arrays.copyOf(coords, 2));
            break;
        case PathIterator.SEG_CLOSE:
            if (numSubPaths > 1) {
                throw new IllegalArgumentException("Path contains multiple subpaths");
            }
            return pointList.toArray(new double[pointList.size()][]);
        default:
            throw new IllegalArgumentException("Path contains curves");
        }
    }
    throw new IllegalArgumentException("Unclosed path");
}

如果您的路径可能包含曲线,则可以使用the flattening version of getPathIterator()

答案 1 :(得分:0)

我怀疑它是否总是可能的,如果有的话...... JavaDoc说:

  

“GeneralPath类表示一个   几何路径构造   直线,二次和   立方(Bézier)曲线。“

因此,如果它是一条曲线,它所包含的点不一定是曲线的一部分。

答案 2 :(得分:0)

就我所寻找的而言,我没有找到任何答案:“如何提取区域的顶峰或 GeneralPath”。

我可以提取一堆片段。使用这种方法,即使是三角形区域也返回 3 个以上的段。

while (!i.isDone()) {
   float[] coords = new float[2];
   int segType = i.currentSegment(coords);
   if (segType != PathIterator.SEG_CLOSE) {
      list.add(coords);
   }
   i.next();
}

return list;