得鹿梦鱼 得鹿梦鱼

曲线算法

圆的生成算法

我们将圆定义为所有距中心位置xc,ycx_c,y_c为给定值rr的点集,对于任意的圆点x,yx,y,这个距离关系可以使用笛卡尔坐标系中的勾股定理来定义

xxc2+yyc2=r2x - x_c^2 + y - y_c^2 = r^2

利用上式,我们可以沿 x 轴从xcxrx_cx -rxc+rx_c + r为单位步长计算对应的 y 值,从而得到每个圆周上的点位置

y=yc±r2xcx2y = y_c \pm \sqrt{r^2 - x_c - x^2}

但是这不是生成圆的最好方法,这个方法的每一个问题就是每一步包含很大的计算量

或者我们可以使用极坐标的方式如下图来计算圆周的点,可以得到方程组
极坐标

{x=xc+rcosθy=yc+rsinθ\begin{cases}x = x_c + r cos \theta \\y = y_c + r sin \theta\end{cases}

使用上述方法可以以固定角度为步长生成显示结果时,就可以利用沿圆周的等距点来绘制圆,但是三角函数的计算是十分耗时的

中点圆算法

具体实现细节请参考计算机图形学及实用编程技术下圆的生成算法_中点画圆算法

椭圆生成算法

椭圆是经过修改的圆,他的半径从一个方向的最大值变为其非正交方向的最小值,椭圆内部这两个正交方向的直线线段称为椭圆的长轴和短轴

椭圆的特征

通过椭圆上任意一点到称为椭圆焦点的两个定点的距离可以给出椭圆的精确定义: 椭圆上任意一点到这两个定点的距离之和都等于与一个常数

xxcrx2+yycry2=1\frac{x - x_c}{r_x}^2 + \frac{y - y_c}{r_y}^2 = 1

或者利用极坐标 r 和θ\theta使用参数方程来描述

{x=xc+rxcosθy=yc+rysinθ\begin{cases}x = x_c + r_x \cos \theta \\y = y_c + r_y \sin \theta\end{cases}

具体实现细节请参考计算机图形学及实用编程技术下椭圆的生成算法_中点椭圆算法

其他曲线

常见的曲线包括圆锥曲线、三角和指数函数、概率分布、通用多项式和样条函数
显示一指定的曲线函数的简单方法是使用直线段来逼近,也可以按照曲线的斜率来选择自增方向

圆锥曲线

通常我们可以使用二次方程来描述圆锥曲线

Ax2+By2+Cxy+Dx+Ey+F=0Ax^2 + By^2 + Cxy + Dx + Ey + F = 0

通过对判别式B24ACB^2 - 4AC的值来决定要生成的特定曲线

B24AC=<0生成椭圆或者圆B24AC=0生成抛物线B24AC=>0生成双曲线B^2 - 4AC = < 0 \text{生成椭圆或者圆} \\B^2 - 4AC = 0 \text{生成抛物线} \\B^2 - 4AC = > 0 \text{生成双曲线}

多项式和样条曲线

曲线拟合是在每对指定点之间构造一三次多项式曲线段,每个曲线段可以通过参数形式藐视为

{x=ax0+ax1u+ax2u2+ax3u3x=ay0+ay1u+ay2u2+ay3u3\begin{cases}x = ax_0 + ax_1u + ax_2u^2 + ax_3u^3 \\x = ay_0 + ay_1u + ay_2u^2 + ay_3u^3\end{cases}
其中参数u在0和1之间变换,参数方程中的u的系数值根据曲线段的边界条件确定。

  1. 两个相邻曲线段具有公共端点
  2. 在边界上匹配两条曲线的斜率,以便得到连续的平滑曲线

并行曲线算法

我们可以采用顺序算法将曲线按曲线分段分配给处理器,也可以使用其他方法来分配