




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
淮海工学院计算机工程学院 实验报告书 课 程 名 计算机图形学 题 目 绘制任意斜率的直线 班 级 测绘 121 学 号 2012122827 姓 名 王其芳 评语 成绩 指导教师 批阅时间 年 月 日 2 一 实验目的或要求 1 1 掌握任意斜率直线的绘制算法 2 2 掌握直线中点 Bresenham 算法的基本原理 能够用 VC 实现该算法 二 二 实验内容 1 掌握直线段的生成算法 并用 C 实现算法 包括中点法生成 直线 2 编程实现 DDA 算法 Bresenham 算法 中点画线法绘制直线段 三 实验代码 1 生成直线的 DDA 算法 算法思想 一个坐标轴上以单位间隔增量 决定另一个坐标轴上最靠近线段路径的对 应整数值 假定 x2 x1 的绝对值大于 y2 y1 的绝对值 取 x 为一个象素单位长 即 x 每 次递增一个象素 然后利用下式计算相应的 y 值 yk 1 yk y yk m x 对于 m 1 的线段 可通过计算由 Y 方向的增量 y 引起的改变来生成直线 xk 1 xk x xk m y 生成直线的 DDA 算法思想是源用初中直线的方程得出来的 而生成直线的中点算法 是通过将 DDA 算法的方程式改为隐函数形式 然后通过与中点的比较确定该取的像素 绘制图线 DDA include include voidvoid linedda intlinedda int x0 intx0 int y0 inty0 int x1 intx1 int y1 inty1 int color color intint x dy dx y x dy dx y floatfloat m m dx x1 x0 dx x1 x0 dy y1 y0 dy y1 y0 m dy dx m dy dx y y0 y y0 for x x0 x x1 x for x x0 x x1 x putpixel x int y 0 5 color putpixel x int y 0 5 color y m y m 3 main main intint a b c d e a b c d e intint graphdriver DETECT graphdriver DETECT intint graphmode 0 graphmode 0 initgraph initgraph cleardevice cleardevice a 0 a 0 b 100 b 100 c 200 c 200 d 300 d 300 e 200 e 200 linedda a b c d e linedda a b c d e getch getch closegraph closegraph 运行结果 1112 exe VC 环境 include include include include 四舍五入四舍五入 intint Round floatRound float x x returnreturn int x int x abs y2abs y2 y1 y1 abs x2abs x2 x1 x1 abs y2abs y2 y1 y1 x x float x1 float x1 y y float y1 float y1 cxcx float x2 float x2 x1 x1 steps steps cycy float y2 float y2 y1 y1 steps steps for intfor int i i 0 0 i i steps steps i i putpixel Round x putpixel Round x Round y Round y color color 在坐标在坐标 x x y y 处画一个处画一个 colorcolor 颜色的点颜色的点 x x cx cx y y cy cy 主函数主函数 voidvoid main main initgraph 640 initgraph 640 480 480 测试画线测试画线 Line DDA 100 Line DDA 100 100 100 100 100 478 478 RED RED 按任意键退出按任意键退出 getch getch 000 exe 5 2 Bresenham 直线算法是用来描绘由两点所决定的直线的算法 它会算出一条线段 在 n 维光栅上最接近的点 这个算法只会用到较为快速的整数加法 减法和位元移位 常 用于绘制电脑画面中的直线 是计算机图形学中最先发展出来的算法 Bresenham 画法与中点法相似 都是通过每列象素中确定与理想直线最近的像素来 进行直线的扫描的转换的 通过各行 各列的象素中心构造一组虚拟网格线的交点 然后 确定该列象素中与此交点最近的像素 该算法的巧妙之处在于可以采用增量计算 使得对 于每一列 只需要检查一个误差项的符号 就可以确定该列的所有对象 根据直线的斜率确定选择变量在 X 方向上或在 Y 方向上每次递增一个单位 另一变量的增 量为 0 或 1 它取决于实际直线与最近网格点位置的距离 这一距离称为误差 设第 k 步 的误差为 ek 选取上面象素点后的积累误差为 ek 1 ek m 1 选取下面的象素点后 的积累误差为 ek 1 ek m Bresenham 程序代码如下 include include include include 使用使用 BresenhamBresenham 算法画任意斜率的直线 包括起始点 不包括终止点 算法画任意斜率的直线 包括起始点 不包括终止点 voidvoid Line Bresenham intLine Bresenham int x1 x1 intint y1 y1 intint x2 x2 intint y2 y2 intint color color intint x x x1 x1 intint y y y1 y1 intint dxdx abs x2abs x2 x1 x1 intint dydy abs y2abs y2 y1 y1 intint s1s1 x2x2 x1x1 1 1 1 1 intint s2s2 y2y2 y1y1 1 1 1 1 boolbool interchangeinterchange false false 默认不互换默认不互换 dxdx dydy ifif dy dy dx dx 当斜率大于当斜率大于 1 1 时 时 dxdx dydy 互换互换 intint temptemp dx dx dxdx dy dy dydy temp temp interchangeinterchange true true 6 intint p p 2 2 dydy dx dx for intfor int i i 0 0 i i 0 0 ifif interchange interchange 当斜率当斜率 1 1 时 选取左右象素点时 选取左右象素点 x x s1 s1 p p 2 2 dx dx ifif interchange interchange x x s1 s1 当斜率当斜率 1 1 时 选取时 选取 y y 为步长为步长 p p 2 2 dy dy 主函数主函数 voidvoid main main initgraph 640 initgraph 640 480 480 测试画线测试画线 Line Bresenham 10 Line Bresenham 10 100 100 100 100 478 BLUE 478 BLUE Line Bresenham 10 Line Bresenham 10 478 478 638 638 1 1 RED RED 按任意键退出按任意键退出 getch getch 运行结果如下 7 Bresenham exe 3 生成直线的中点算法 算法思想 中点算法主要是利用椭圆的正负划分性 利用已知或以求出的点 根据递推关系来判 断下一个点的位置 中点算法有效地消除了 DDA 浮点运算效率低下的问题 将直线的斜率 m 转化为可加 的数 然后通过中点来确定要选择的点 这样使得中点算法的效率大大提高 使之成为被 图形软件广泛采用的算法之一 代码如下 include include include include 使用中点算法画任意斜率的直线 包括起始点 不包括终止点 使用中点算法画任意斜率的直线 包括起始点 不包括终止点 voidvoid Line Midpoint intLine Midpoint int x1 x1 intint y1 y1 intint x2 x2 intint y2 y2 intint color color intint x x x1 x1 y y y1 y1 intint a a y1y1 y2 y2 b b x2x2 x1 x1 intint cxcx b b 0 0 1 1 b b b b 1 1 intint cycy a a 0 0 1 1 a a a a 1 1 putpixel x putpixel x y y color color intint d d d1 d1 d2 d2 ifif a a b b 斜率绝对值斜率绝对值 1 1 d d 2 2 a a b b d1d1 2 2 a a d2d2 2 2 a a b b while xwhile x x2 x2 ifif d d 1 1 d d 2 2 b b a a d1d1 2 2 b b d2d2 2 2 a a b b while ywhile y y2 y2 if dif d 0 0 d d d1 d1 elseelse x x cx cx d d d2 d2 y y cy cy putpixel x putpixel x y y color color 主函数主函数 voidvoid main main initgraph 640 initgraph 640 480 480 测试画线测试画线 Line Midpoint 100 Line Midpoint 100 50 50 100 100 478 478 GREEN GREEN Line Midpoint 1 Line Midpoint 1 478 478 638 638 1 1 BLUE BLUE 按任意键退出按任意键退出 getch getch 9 exe 四 实验结果 1 该程序实现了三种算法的直线段
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论