C语言实现Berzier曲线几何作图算法

前言:

  • 隐式曲线表达上的限制
  1. 计算上的多值性(例如可能一个 x 对应多个 y)
  2. 存在导数  未定义的点
  3. 坐标系进行变换后,曲线表达形式将可能会发生改变

  • 一般的多项式幂基函数缺乏直观的几何意义

我们考虑由3个二元点对构造的二维平面曲线,其中参数变量 t∈R :

代码实现:

#include<stdio.h>
//输入参数为控制点坐标
//控制点P的个数为n+1
//t为参数值,其区间变化为0到1
//函数返回值Berzier曲线在参数为t的坐标值
double decas(double P[], int n, double t) {
	int m, i;
	double*R, *Q, P0;
	R = &P[n + 1];
	Q = &P[n + 1];
	for (int i = 0; i <=n ; i++)
	{
		R[i] = P[i];//将控制点坐标P保存在R中
		//做n次外循环
		//每次循环都计算控制多边形上所有的m条边以参数t分别为分割比例的坐标值
	}
	for (m = n; m >0; m--)
	{
		//做m次内循环
		//每次循环计算控制多边形上一条边以参数t为分割比例的坐标值
		for ( i = 0; i <=m-1; i++)
		{
			//n次berzier曲线在点t的值,可由两条n-1的berzier曲线
			//在点t的值通过线性组合而求得
			Q[i].x = R[i].x + t * (R[i + 1].x - R[i].x);
			Q[i].y = R[i].y + t * (R[i + 1].y - R[i].y);
		}
		for ( i = 0; i <=m-1; i++)
		{
			R[i] = Q[i];
		}
	}
	P0 = R[0];
	delete R;
	delete Q;
	return (P0);
}

//输入参数P为控制带点坐标
//控制点P的个数为n+1
//输出参数采用几何作图算法生成Bezier曲线上的离散点序列pts
//离散点序列pts的个数为npoints+1

void bez_to_points(double P[], int n, double pts[], int npoints)
{
	double t, delt;
	delt = 1.0 / (double)npoints;//将参数t变化区间进行npoints等分
	t = 0.0;
	for (int i = 0; i < npoints; i++)
	{
		pts[i] = decas(P, n, t);//分别求出npoints+1个离散点pts的坐标
		t += delt;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值