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

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...