微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java Besier贝塞尔曲线工具类

    /**
     * 贝塞尔曲线
     * @param points 途径的点,首为起点,末为终点
     * @param size 希望得到的总点数,含起点和终点
     * @return size个贝塞尔曲线离散点的集合
     */
    public static List<Point> besier(List<Point> points, int size){
        size--;
        List<Point> list = new ArrayList<>();
        double step = 1.0f/size;
        double percent = 0;
        for(int i = 0; i < size; i++){
            Point point = besierCurvePixel(points, percent);
            percent += step;
            list.add(point);
        }
        list.add(besierCurvePixel(points, 1));
        return list;
    }

    private static int fact(int n) {
        int fact = 1;
        for (int i = 1; i <= n; i++) {
            fact *= i;
        }
        return fact;
    }

    private static double bernstein(double t, int n, int i){
        return ((double) fact(n) / (fact(i) * fact(n-i))) * Math.pow(1-t, n-i) * Math.pow(t, i);
    }

    private static Point besierCurvePixel(List<Point> points, double percent){
        int size = points.size();
        double[] bpoly = new double[size];
        for(int i = 0; i < size; i++){
            bpoly[i] = bernstein(percent, size, i+1);
        }
        double sumX = 0;
        double sumY = 0;
        for(int i = 0; i < size;  i++){
            Point point = points.get(i);
            sumX += bpoly[i] * point.x;
            sumY += bpoly[i] * point.y;
        }
        int x, y;
        x = (int) Math.round(sumX);
        y = (int) Math.round(sumY);
        return new Point(x, y);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐