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