请教LVGL中的lv_bezier3函数怎么使用?

使用的是LVGL8.3版本,函数原型如下:
uint32_t lv_bezier3(uint32_t t, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3)

我想指定4个点用于画一条贝塞尔曲线 ,每个点包含屏幕X,Y坐标。但这个函数好像不是使用的坐标数据,请指教,谢谢!

参考: https://lvgl.100ask.net/master/examples.html#cubic-bezier-animation

谢谢。这个例子我有看过,但是还是疑惑,我的屏幕是2560*1440的大分辨率屏,需要全屏范围画线,使用lv_line来画,lv_bezier3这个函数的参数我不知道如何和实际的屏幕坐标联系起来(X,Y),u0~u3的范围都是[0…LV_BEZIER_VAL_MAX]即0-1024,

lv_example_anim_3中代码是这样的:
static void refer_chart_cubic_bezier(void)
{
for(uint16_t i = 0; i <= CHART_POINTS_NUM; i ++) {
uint32_t t = i * (1024 / CHART_POINTS_NUM);//x
int32_t step = lv_bezier3(t, 0, ginfo.p1, ginfo.p2, 1024);//y
lv_chart_set_value_by_id2(ginfo.chart, ginfo.ser1, i, t, step);
}
lv_chart_refresh(ginfo.chart);
}
即t是x坐标范围为0-1024,lv_bezier3计算结果step是y坐标,这是相对坐标么?我需要的是绝对坐标。

你好,请问你弄懂这个函数怎么用了吗?

是否可以提供一个示例

是的,搞明白了。
uint32_t lv_bezier3(uint32_t t, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3)
lvgl中提供了这个函数,实际上u0,u1,u2,u3,就是对应坐标点的x或者y,就是说计算x和y的
算法是一样的,但是这个函数不是以点x,y的形式定义的参数,所以你需要对x和y都使用这个函数来计算。后面我发现个问题,用这个函数画出来的曲线好像锯齿很多,猜测是只使用了整数计算有误差,自己在网上找下其他的浮点数的实现:

lv_point_t cubicBezier(lv_point_t p0, lv_point_t p1, lv_point_t p2, lv_point_t p3, double t) {
lv_point_t p;
p.x = pow((1 - t), 3) * p0.x + 3 * pow((1 - t), 2) * t * p1.x + 3 * (1 - t) * pow(t, 2) * p2.x + pow(t, 3) * p3.x;
p.y = pow((1 - t), 3) * p0.y + 3 * pow((1 - t), 2) * t * p1.y + 3 * (1 - t) * pow(t, 2) * p2.y + pow(t, 3) * p3.y;
return p;
}

uint32_t div_cnt = 200;  //这是整条曲线的点数,自己调整
lv_point_t p_temp;

lv_point_t *new_point = (lv_point_t*)malloc(div_cnt*sizeof(lv_point_t));

#if 1
for(uint32_t i = 0; i <= div_cnt; i++) {
float t = (float)i / (float)div_cnt;
p_temp = cubicBezier(points[0], points[1], points[2], points[3], t);
new_point[i] = (lv_point_t){p_temp.x, p_temp.y};
}
#endif

lv_line_set_points(bezier_line, new_point, div_cnt);