计算机中的曲线

4 阅读4分钟

体验地址

与数学书里曲线的不同

计算机处理曲线可以分为两部分:如何计算曲线如何画曲线

在计算领域,计算机中的曲线和我们在数学书上学习的曲线基本相同。

但是在画曲线方面,由于gpu只能画点、直线、三角面等基础图形,不能直接画曲线,所以在画曲线物体的时候,只能先把连续的曲线转换成gpu能识别的图形才能顺利画出来。

曲线的表示方法

笛卡尔表示法

这就是我们数学书里最常见的表示方法,大多是用y和x的关系式来表示,比如y=x²、y=sinx。它的特点是直观,能直接看出x和y的对应关系,但在计算机处理复杂曲线时,有时会不够灵活。

参数表示法

引入一个独立的参数(一般是t),让x和y都变成这个参数的函数,比如x=f(t)、y=g(t)。这种方法更适合计算机计算,能轻松画出一些复杂曲线,比如贝塞尔曲线,还能方便控制曲线的范围。

曲线的方向

体验地址

切线、法线、斜率、导数

  • 切线:正好和曲线走向相切的直线。
  • 法线:和切线垂直的直线。
  • 斜率:切线和水平方向的夹角的正切值。
  • 导数:数学上求导的结果,就是曲线上某一点的斜率。

它们之间的关系

:::tips 求导数 = 求斜率 -> 求切线 -> 求法线。

:::

假设曲线是y=f(x)y=f(x)

则其任意点(x0,y0)(x_0,y_0)导数为y=f(x)=f(x0)y=f'(x)=f'(x_0)

所以其任意点(x0,y0)(x_0,y_0)斜率为k=f(x)=f(x0)k=f'(x)=f'(x_0)

所以其任意点(x0,y0)(x_0,y_0)切线公式为y=k(xx0)+y0y = k(x-x_0)+y_0

所以其任意点(x0,y0)(x_0,y_0)法线公式为y=1k(xx0)+y0y = -\frac{1}{k}(x-x_0)+y_0

切向量与法向量

曲线上任意点的切向量为t=(1,k)\vec{t} = (1,k)

曲线上任意点的法向量为n=(k,1)\vec{n} = (k, -1)

参数方程曲线求导

假设曲线参数方程为:{x=x(t)y=y(t)\boxed{\begin{cases} x = x(t) \\ y = y(t) \end{cases}}

则其一阶导数为:dydx=y(t)x(t)(x(t)0)\boxed{\dfrac{dy}{dx} = \dfrac{y'(t)}{x'(t)} (x'(t) \neq 0)}

则其二阶导数为:d2ydx2=y(t)x(t)y(t)x(t)[x(t)]3(x(t)0)\boxed{\dfrac{d^2y}{dx^2} = \dfrac{y''(t)x'(t)-y'(t)x''(t)}{\left[x'(t)\right]^3} (x'(t) \neq 0)}

曲率:曲线弯曲程度的度量

体验地址

:::info κ=y(1+y2)32\kappa = \frac{y''}{\left(1+y'^2\right)^{\frac{3}{2}}}

:::

  • κ|\kappa|越大代表曲线越弯曲,κ|\kappa|越小代表曲线越平缓。
  • 半径为r的圆的曲率公式:κ=1r|\kappa| = \frac{1}{r}

曲线的平滑程度:Cn连续C^n连续

我们一般用Cn连续C^n连续来度量曲线的平滑程度。

我们常见的多项式曲线、样条曲线等,本身都是无限光滑的,所以我们一般用CnC^n来度量两段曲线连接处的光滑程度。

C0连续C^0连续:曲线连接处无断开,但**存在明显尖角/折点**。

C1连续C^1连续:等价于连接处**切线连续**、曲线一阶导数连续速度连续

C2连续C^2连续:等价于连接处曲率连续曲线二阶导数连续加速度连续

体验地址

曲线的离散化

体验地址

由于gpu无法直接绘制曲线,所以最常见的做法是把连续的曲线,转换成很多小三角形让gpu去绘制,而为了转换成三角形,就需要在曲线上每隔一段距离取一个点,这个过程叫做曲线的离散化。

一般有以下细分策略:

  • 按参数均匀分段:如果曲线是用参数方程定义的,会有一个参数 t,可以把 t 从 0 到 1 按 0、0.1、0.2…… 这样均匀分段。优点是计算简单、实现方便;缺点是在参数 t 上均匀采样,在实际曲线上采样点的分布可能不均匀,尤其是在曲线弯曲比较急的地方,点会显得比较稀疏。
  • 固定步长分段:例如沿着曲线每隔固定长度(比如 N 米)取一个点,优点是在曲线弯曲程度大的地方,采样点会自动变得更密集。
  • 按误差限制分段:在用直线段近似曲线的过程中总会存在误差,我们可以设定一个最大允许误差阈值,算法会根据曲线的形状自动调整分段密度:平缓的地方分段更疏、每段更长,弯曲急的地方分段更密、每段更短,这样可以在保证精度的前提下减少点数、提高效率。