【问题标题】:Obtain ordered vertices of GeneralPath获取GeneralPath的有序顶点
【发布时间】:2011-04-27 11:12:33
【问题描述】:

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

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

【问题讨论】:

    标签: java geometry 2d


    【解决方案1】:

    您可以通过@987654321@取回积分。

    我不确定你的约束是什么,但如果你的形状总是只有一个封闭的子路径并且只有直边(没有曲线),那么以下将起作用:

    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()

    【讨论】:

      【解决方案2】:

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

      "GeneralPath 类表示一个 几何路径由 直线,二次和 三次(贝塞尔)曲线。”

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

      【讨论】:

        【解决方案3】:

        就我所寻找的而言,我没有找到任何答案:“如何提取区域的顶峰,或者 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-26
          • 1970-01-01
          • 1970-01-01
          • 2013-03-13
          • 2017-03-02
          • 1970-01-01
          相关资源
          最近更新 更多