/**
* 贝塞尔曲线
* @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 举报,一经查实,本站将立刻删除。