贝塞尔曲线的C语言实现

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内

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值