问题描述
在matlab中,利用贝塞尔曲线绘制闭合的水滴形曲线,并计算曲线上各点的曲率。
基础知识
贝塞尔曲线
在之前的博客中已经介绍过贝塞尔曲线的基本形式(详见贝塞尔曲线简介)。由于水滴形曲线是一条闭合曲线,需要首尾两个控制点重合,另外中间至少还需要两个位置不同的控制点,则一共需要四个控制点,因此选择三阶贝塞尔曲线来实现。
曲率定义
对于一条光滑曲线C,曲线C上从点M到M’的弧为Δs,切线的转角为Δα。
平均曲率: 定义 为弧段 的平均曲率。它反映了弧 的平均弯曲程度。
曲率:称 为曲线C在点M处的曲率。
在 存在的条件下,。此式即为曲率的计算公式。
设曲线的直角坐标方程是,且 具有二阶导数。因为,所以 ,又知 (弧微分公式),从而有
补充:
弧微分公式推导
对于参数方程,可以采用同样的推导方法求出曲率计算公式。若参数方程形式为,则曲率的计算公式为。
matlab绘制曲线
首先定义四个控制点的坐标,然后根据三阶贝塞尔曲线方程计算对应于参数t的x, y值。这里设置步长为0.01。
1 | % 控制点坐标 |
绘制的结果为
matlab计算曲率
根据曲率计算公式,首先需要计算x, y对t的一阶和二阶导数,可以用定义符号变量的方法计算。
首先定义t为符号变量,计算x, y的符号表达式。
1 | syms t; |
此时可以看到t, phi, omega都是sym类型的变量。
然后求phi和omega的一阶、二阶导数。
1 | phi1 = diff(phi); |
最后根据公式计算曲率K,并将符号表达式转换为数值。其中subs是符号替换函数,可以将符号表达式中的某些符号变量替换为指定的新变量。调用方式为:subs(s, old, new)
,将所有的old换成new,并计算s,返回s。需要注意的是subs返回的仍然是符号表达式,需要用double函数再转化为数值类型。
1 | k = (abs(phi1.*omega2 - omega1.*phi2) / (phi1.^2 + omega1.^2).^(1.5)); |
k1中保存的变量就是对应于t=0到1共101个点的曲率值。
其他
如果想要画一个以水滴形顶点为圆心,分别旋转120°、240°,形成三个水滴组成的旋转对称图案,可以将x, y转化成极坐标,并绘制极坐标图。cart2pol函数可以将笛卡尔坐标转换为极坐标。
1 | [TH,R] = cart2pol(x, y); |
最终结果如图: