void cubic_bezier(int pointNum, float x2, float y2, float x3, float y3, float* out_data_x, float* out_data_y) {
// 曲线点的个数
float t = 1.0 / pointNum;
float t2 = t * t;
float t3 = t * t2;
float x1 = 0, y1 = 0;
float x4 = 1, y4 = 1;
// 预计算
float pre_3t = 3 * t;
float pre_3t2 = 3 * t2;
float pre_6t2 = 6 * t2;
float pre_6t3 = 6 * t3;
// (p1 - 2p2 + p3)
float tmp1x = x1 - x2 * 2.0 + x3;
float tmp1y = y1 - y2 * 2.0 + y3;
// (-p1 + 3p2 - 3p3 + p4)
float tmp2x = (x2 - x3) * 3.0 - x1 + x4;
float tmp2y = (y2 - y3) * 3.0 - y1 + y4;
// p1
float fx = x1;
float fy = y1;
// (p2 - p1) * 3t +
// (p1 - 2p2 + p3) * 3t2 +
// (-p1 + 3p2 - 3p3 + p4) * t3
float dfx = (x2 - x1) * pre_3t + tmp1x * pre_3t2 + tmp2x * t3;
float dfy = (y2 - y1) * pre_3t + tmp1y * pre_3t2 + tmp2y * t3;
// (p1 - 2p2 + p3) * 6t2 +
// (-p1 + 3p2 - 3p3 + p4) * 6t3
float ddfx = tmp1x * pre_6t2 + tmp2x * pre_6t3;
float ddfy = tmp1y * pre_6t2 + tmp2y * pre_6t3;
// (-p1 + 3p2 - 3p3 + p4) * 6t3
float dddfx = tmp2x * pre_6t3;
float dddfy = tmp2y * pre_6t3;
// fx, fy 就是t值对应计算出的曲线值
while (pointNum--) {
fx += dfx;
fy += dfy;
dfx += ddfx;
dfy += ddfy;
ddfx += dddfx;
ddfy += dddfy;
*out_data_x = fx;
*out_data_y = fy;
out_data_x++;
out_data_y++;
}
}
经验证在200M主频的单片机下计算2000个点,可以耗时2ms内