与数学书里曲线的不同
计算机处理曲线可以分为两部分:如何计算曲线和如何画曲线。
在计算领域,计算机中的曲线和我们在数学书上学习的曲线基本相同。
但是在画曲线方面,由于gpu只能画点、直线、三角面等基础图形,不能直接画曲线,所以在画曲线物体的时候,只能先把连续的曲线转换成gpu能识别的图形才能顺利画出来。
曲线的表示方法
笛卡尔表示法
这就是我们数学书里最常见的表示方法,大多是用y和x的关系式来表示,比如y=x²、y=sinx。它的特点是直观,能直接看出x和y的对应关系,但在计算机处理复杂曲线时,有时会不够灵活。
参数表示法
引入一个独立的参数(一般是t),让x和y都变成这个参数的函数,比如x=f(t)、y=g(t)。这种方法更适合计算机计算,能轻松画出一些复杂曲线,比如贝塞尔曲线,还能方便控制曲线的范围。
曲线的方向
切线、法线、斜率、导数
- 切线:正好和曲线走向相切的直线。
- 法线:和切线垂直的直线。
- 斜率:切线和水平方向的夹角的正切值。
- 导数:数学上求导的结果,就是曲线上某一点的斜率。
它们之间的关系
:::tips 求导数 = 求斜率 -> 求切线 -> 求法线。
:::
假设曲线是
则其任意点导数为
所以其任意点斜率为
所以其任意点切线公式为
所以其任意点法线公式为
切向量与法向量
曲线上任意点的切向量为
曲线上任意点的法向量为
参数方程曲线求导
假设曲线参数方程为:
则其一阶导数为:
则其二阶导数为:
曲率:曲线弯曲程度的度量
:::info
:::
- 越大代表曲线越弯曲,越小代表曲线越平缓。
- 半径为r的圆的曲率公式:
曲线的平滑程度:
我们一般用来度量曲线的平滑程度。
我们常见的多项式曲线、样条曲线等,本身都是无限光滑的,所以我们一般用来度量两段曲线连接处的光滑程度。
:曲线连接处无断开,但**存在明显尖角/折点**。
:等价于连接处**切线连续**、曲线一阶导数连续、速度连续。
:等价于连接处曲率连续、曲线二阶导数连续、加速度连续。
曲线的离散化
由于gpu无法直接绘制曲线,所以最常见的做法是把连续的曲线,转换成很多小三角形让gpu去绘制,而为了转换成三角形,就需要在曲线上每隔一段距离取一个点,这个过程叫做曲线的离散化。
一般有以下细分策略:
- 按参数均匀分段:如果曲线是用参数方程定义的,会有一个参数 t,可以把 t 从 0 到 1 按 0、0.1、0.2…… 这样均匀分段。优点是计算简单、实现方便;缺点是在参数 t 上均匀采样,在实际曲线上采样点的分布可能不均匀,尤其是在曲线弯曲比较急的地方,点会显得比较稀疏。
- 固定步长分段:例如沿着曲线每隔固定长度(比如 N 米)取一个点,优点是在曲线弯曲程度大的地方,采样点会自动变得更密集。
- 按误差限制分段:在用直线段近似曲线的过程中总会存在误差,我们可以设定一个最大允许误差阈值,算法会根据曲线的形状自动调整分段密度:平缓的地方分段更疏、每段更长,弯曲急的地方分段更密、每段更短,这样可以在保证精度的前提下减少点数、提高效率。