抛物线 f ( x ) = a x 2 f(x)=ax^2 f(x)=ax2的中点Bresenham算法

语言:matlab

画图:plot

1 抛物线的特征

通常定义抛物线为到一条直线(准线)和直线外一点(焦点)距离相等的点的集合。这里只讨论顶点为原点,沿纵坐标轴对称且开口向上的情况。而对于其他情况可以通过图形的平移和旋转等线性变换得到。其描述方程如下:
F ( x , y ) = y − a x 2 ( a > 0 ) F(x,y)=y-ax^2(a>0) F(x,y)=y−ax2(a>0)
与椭圆不同,抛物线是无边界的非封闭图形,若要在屏幕上绘制,必须给定坐标范围,以绘制指定抛物线的一个片段。可以在函数中设置参数 x m xm xm,则横坐标约束其范围为 [ − x m , x m ] [-xm,xm] [−xm,xm]。

抛物线关于纵坐标轴对称,故只需绘制其第一象限内的点,第二象限中的点可以通过对称得到。

为确定最大位移方向,考虑抛物线的斜率范围。在第一象限,其上一点 ( x , y ) (x,y) (x,y)处的斜率为:
k ( x ) = ∂ F ( x , y ) ∂ x = 2 a x ∈ [ 0 , + ∞ ) k(x)=\frac{\partial F(x,y)}{\partial x}=2ax \in [0,+\infty) k(x)=∂x∂F(x,y)​=2ax∈[0,+∞)

又由于斜率的变化率为:
d k ( x ) d x = d ( 2 a x ) d x = 2 a > 0 \frac {dk(x)}{dx}=\frac {d(2ax)}{dx}=2a>0 dxdk(x)​=dxd(2ax)​=2a>0

所以在第一象限内,抛物线斜率从0开始随 x x x递增至正无穷。用斜率为1的点对图形进行划分。容易解出,当斜率为1时, x = 1 2 a x=\frac {1}{2a} x=2a1​。只需沿 x x x轴绘制图形,其 0 < x < 1 2 a 0<x<\frac {1}{2a} 0<x<2a1​时,最大位移方向为 x x x方向; 1 2 a < x < x m \frac {1}{2a}<x<xm 2a1​<x<xm时,最大位移方向为 y y y方向。

2 算法推导过程

假定当前与抛物线距离最近者已确定为 P ( x i , y i ) P(x_i,y_i) P(xi​,yi​)那么在抛物线前部分时,下一候选点是 P d ( x i + 1 , y i ) P_d(x_i+1,y_i) Pd​(xi​+1,yi​)和 P d ( x i + 1 , y i + 1 ) P_d(x_i+1,y_i+1) Pd​(xi​+1,yi​+1);而在抛物线的后半部分时,下一候选点是 P l ( x i , y i + 1 ) P_l(x_i,y_i+1) Pl​(xi​,yi​+1)和 P r ( x i + 1 , y i + 1 ) P_r(x_i+1,y_i+1) Pr​(xi​+1,yi​+1)。仍然使用中点进行判别候选点。

2.1 推导前半部分的抛物线绘制公式

对于 0 < x < 1 2 a 0<x<\frac {1}{2a} 0<x<2a1​:构造判别式
d l i = F ( x i + 1 , y i + 0.5 ) = y i + 0.5 − a ( x i + 1 ) 2 d_{li}=F(x_i+1,y_i+0.5)=y_i+0.5-a(x_i+1)^2 dli​=F(xi​+1,yi​+0.5)=yi​+0.5−a(xi​+1)2
若 d l i ≥ 0 d_{li}\ge 0 dli​≥0,中点在抛物线上方,应选取 P d ( x i + 1 , y i ) P_d(x_i+1,y_i) Pd​(xi​+1,yi​),反之选取 P u ( x i + 1 , y i + 1 ) P_u(x_i+1,y_i+1) Pu​(xi​+1,yi​+1)。

误差项递推:

在 d l i ≥ 0 d_{li}\ge 0 dli​≥0时,应计算:
d l ( i + 1 ) = F ( x i + 2 , y i + 0.5 ) = y i + 0.5 − a ( x i + 2 ) 2 = d l i + a [ ( x i + 1 ) 2 − ( x i + 2 ) 2 ] = d l i − 2 a x i − 3 a d_{l(i+1)}=F(x_i+2,y_i+0.5)\\ =y_i+0.5-a(x_i+2)^2\\ =d_{li}+a[(x_i+1)^2-(x_i+2)^2]\\ =d_{li}-2ax_i-3a\\ dl(i+1)​=F(xi​+2,yi​+0.5)=yi​+0.5−a(xi​+2)2=dli​+a[(xi​+1)2−(xi​+2)2]=dli​−2axi​−3a
在 d l i < 0 d_{li}< 0 dli​<0时,应计算:
d l ( i + 1 ) = F ( x i + 2 , y i + 1.5 ) = y i + 1.5 − a ( x i + 2 ) 2 = d l i − 2 a x i − 3 a + 1 d_{l(i+1)}=F(x_i+2,y_i+1.5)\\ =y_i+1.5-a(x_i+2)^2\\ =d_{li}-2ax_i-3a+1\\ dl(i+1)​=F(xi​+2,yi​+1.5)=yi​+1.5−a(xi​+2)2=dli​−2axi​−3a+1
计算判别式的初始值。弧起点为 ( 0 , 0 ) (0,0) (0,0),因此第一个中点为 ( 1 , 0.5 ) (1,0.5) (1,0.5),对应的判别式为:
d l 0 = y 0 + 0.5 − a ( x 0 + 1 ) 2 = 0.5 − a d_{l0}=y_0+0.5-a(x_0+1)^2=0.5-a dl0​=y0​+0.5−a(x0​+1)2=0.5−a

2.2 推导后半部分的抛物线绘制公式

对于 1 2 a < x < x m \frac {1}{2a}<x<xm 2a1​<x<xm:构造判别式
d r i = F ( x i + 0.5 , y i + 1 ) = y i + 1 − a ( x i + 0.5 ) 2 d_{ri}=F(x_i+0.5,y_i+1)=y_i+1-a(x_i+0.5)^2 dri​=F(xi​+0.5,yi​+1)=yi​+1−a(xi​+0.5)2
若 d r i ≥ 0 d_{ri}\ge 0 dri​≥0,中点在抛物线(左)上方,应选取 P l ( x i , y i + 1 ) P_l(x_i,y_i+1) Pl​(xi​,yi​+1),反之选取 P r ( x i + 1 , y i + 1 ) P_r(x_i+1,y_i+1) Pr​(xi​+1,yi​+1)。

误差项递推:

在 d r i ≥ 0 d_{ri}\ge 0 dri​≥0时,应计算:
d r ( i + 1 ) = F ( x i + 0.5 , y i + 2 ) = y i + 2 − a ( x i + 0.5 ) 2 = d r i + 1 d_{r(i+1)}=F(x_i+0.5,y_i+2)\\ =y_i+2-a(x_i+0.5)^2\\ =d_{ri}+1\\ dr(i+1)​=F(xi​+0.5,yi​+2)=yi​+2−a(xi​+0.5)2=dri​+1
在 d r i < 0 d_{ri}< 0 dri​<0时,应计算:
d r ( i + 1 ) = F ( x i + 1.5 , y i + 2 ) = y i + 2 − a ( x i + 1.5 ) 2 = d r i − 2 a x i − 2 a + 1 d_{r(i+1)} =F(x_i+1.5,y_i+2)\\ =y_i+2-a(x_i+1.5)^2\\ =d_{ri}-2ax_i-2a+1\\ dr(i+1)​=F(xi​+1.5,yi​+2)=yi​+2−a(xi​+1.5)2=dri​−2axi​−2a+1
计算判别式的初始值。弧起点横坐标为 ⌈ 1 2 a ⌉ \lceil \frac{1}{2a} \rceil ⌈2a1​⌉,对应的判别式为:
d r 0 = y 0 + 1 − a ( x 0 + 0.5 ) 2 = 1 − a ⌈ 1 2 a ⌉ − 0.25 a d_{r0}=y_0+1-a(x_0+0.5)^2=1-a\lceil \frac{1}{2a} \rceil-0.25a dr0​=y0​+1−a(x0​+0.5)2=1−a⌈2a1​⌉−0.25a

算法代码(matlab)

function DrawBresenhamCurve(a,xm)div=0.5/a;x=0,y=0;d_pre=0.5-a;d_post=1-a*ceil(0.5/a)-0.25*a;while x<=xmplot(x,y);hold on;plot(-x,y);hold on;if x<divtmp=-2*a*x-3*a;x++;if d_pre<0y++;d_pre=d_pre+tmp+1;elsed_pre=d_pre+tmp;endifelsetmp=-2*a*x-2*a+1;y++;if d_post<0d_post=d_post+1;elsed_post=d_post+tmp;x++;endifendifendwhile
end

运行情况:

测试代码:

a=0.01;
xm=100;
DrawBresenhamCurve(a,xm);
X=linspace(-xm,xm,1000);
Y=a.*X.^2.;
plot(X,Y);
grid on;

运行结果(点为算法生成的点集,曲线为所拟合的实际曲线):

计算机图形学-抛物线的中点Bresenham算法相关推荐

  1. 计算机图形学04:中点Bresenham算法画椭圆

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  2. 计算机图形学05:中点BH算法对任意斜率的直线扫描转换方法

    作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...

  3. 计算机图形学第一次上机——中点线算法和中点圆算法

    计算机图形学第一次上机实验 课程实验报告 目录 计算机图形学第一次上机实验 课程实验报告 一.实验目的 二.实验环境 三.实验内容 1.中点线算法 2.中点圆算法 四.实验心得 附录:程序源代码 一. ...

  4. 计算机图形学学习(一) 直线Bresenham算法讲解及matlab实现

    文章目录 Bresenham算法介绍 Bresenham算法实现 matlab代码实现 成果演示 最后 Bresenham算法介绍 Bresenham是计算机图形学领域使用最广泛的直线扫描转换算法,其 ...

  5. 【计算机图形学】基于OpenGL的中点Bresenham算法画直线

    学习过三种画直线的方法(DDA.中点Bresenham算法.改进的中点Bresenham算法)后,想着实际操作一下如何能够实现,OpenGL无疑是很好的选择,在老师的推荐下,我尝试着用OpenGL来实 ...

  6. 计算机图形学:直线段的生成算法,VS实现数值微分法和中点Bresenham算法

    实验要求: 实现直线段生成的两种方法: 1) 数值微分法 和 2) 中点Bresenham算法.用户用鼠标点击两个点,两个点都确定后,利用直线段的绘制算法绘制两个点之间的一条直线段.本文章仅涉及算法的 ...

  7. 图形学-中点Bresenham算法

    图形学-中点Bresenham算法 原理 代码 例子 原理 由Bresenham提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别. 这时直线将 ...

  8. 计算机图形学直线段的生成算法

    计算机图形学直线段的生成算法C++实现,包括:DDA,中点画线,改进的Bresenham画线 文章目录 1.实验目的和内容 1.1实验目的 1.2实验内容 2.算法原理 2.1 DDA(数值微分算法) ...

  9. 图形学画直线c语言,002计算机图形学之直线画线算法

    002计算机图形学之直线画线算法 我们知道直线方程的斜截式是如下的样子: y = kx +b 在显示器上显示直线的话,如果使用如上的方程,每描一个点 需要进行一次浮点乘法,一次浮点加法,和取整操作. ...

最新文章

  1. ue linux转dos格式,uestudio中如何把dos格式转为unix
  2. 神策数据助力海通证券,精耕 4 大场景,全面强化数字化运营
  3. 腾讯JAVA岗位四面,腾讯Java社招四面面经分享(4年java经验者)
  4. 一个老者给年轻人的几个忠告
  5. 二、网络编程中的常用类
  6. python zip函数_Python zip()函数
  7. python 空列表对象的布尔值_python – 从TensorFlow对象中检索数据 – 来自correct_prediction的布尔值列表...
  8. 搞了一个迭代发布下SpringBoot Jar瘦身方案,老大给我打了个A+
  9. Javascript 监控键盘输入事件
  10. CppCheck的使用
  11. 计算机平面设计要学语数英吗,《计算机平面设计与制作》课程标准规范.doc
  12. NOI 2017 滚粗记
  13. 初来乍到,余生请多指教
  14. bootstrap-table实现表格编辑
  15. mysql查询名字相同数据排列出来_mysql 的sql语句来查找重复数据,并让其都显示出来?...
  16. 在C语言二级考试中编程题编译,二级C语言上机编程题
  17. 【ShaderToy】开篇
  18. 手把手教你从零搭建深度学习项目(附链接)
  19. opendrive网盘 一个能免费直接外链的网盘
  20. 存储--盘古,阿里云飞天分布式存储系统设计深度解析

热门文章

  1. 打工人不再为难打工人,这款神器,竟是摸鱼党上班必备
  2. python 文件去重
  3. 计算机专业术语及其解释,计算机专业术语解释
  4. 天津工业大学计算机学院教务处,天津工业大学教务管理系统入口http://jwc.tjpu.edu.cn/...
  5. UE编辑器对大文件进行替换操作
  6. Uber乱世布局,反Amazon联盟,视频行业转折点
  7. 换道超车 区块链是你的捷径
  8. Everything 1.3.3 Beta 简体中文绿色版 | 极速文件搜索工具
  9. Linux系统下返回上一级目录的命令
  10. Proxmox VE(PVE)、软路由、黑群晖(NAS)成功之道