计算机图形学实验一画直线_第1页
计算机图形学实验一画直线_第2页
计算机图形学实验一画直线_第3页
计算机图形学实验一画直线_第4页
计算机图形学实验一画直线_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、贵州大学实验报告学院:计算机科学与技术 专业: 计算机科学与技术 班级:计科131姓名学号实验组实验时间指导教师黄初华成绩实验项目名称直线生成实验目的实验目的通过本实验,使学生了解并掌握在光栅显示系统中直线的生成和显示算法,熟悉相关开发平台。为后继实验打下基础。实验要求实验组织运行要求以学生自主训练为主的开放模式组织教学。实验原理xPi=(xi, yi)MQP1p2y中点画线法算法原理:设0<k<1中点M在直线下方,下一点取p1点;中点M在直线上方取p2点。中点算法用整数加法及比较代替了DDA中的浮点数加法及取整运算,效率大大提高。假设直线的起点、终点分别为:(X0,Y0),(X1

2、,Y1),直线将二维空间划分为三个区域:直线方程: F(x,y)=ax+by+c=0其中: a=-(y1-y0),b=(x1-x0),c=-B(x1-x0)如F(x,y)=0, 则(x,y) 在直线上如F(x,y)<0, 则(x,y)在直线下方如F(x,y)>0, 则(x,y)在直线上方yxF(x,y)=0F(x,y)>0F(x,y)<0(x1,y1)(x0,y0)因此,可将中点M的坐标(Xp+1,Yp+0.5)代入直线方程,并判断其符号即可确定象素点的选取。定义决策变量:d= F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c如果 d>0,则M

3、在理想直线上方,选正右方P2点;如果 d<0,则M在理想直线下方,选右上方P1点;如果 d=0,则M在理想直线上,选P1/ P2点。由于d是xi和yi的线性函数,可采用增量计算提高运算效率。1.如由pi点确定在是正右方P2点(d>0).,则新的中点M仅在x方向加1,新的d值为:dnew=F(xi+2,yi+0.5)=a(xi+2)+b(yi+0.5)+c而 dold=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+cdnew=dold+a= dold-dy2.如由pi点确定是右上方P1点(d<0),则新的中点M在x和y方向都增加1,新的d值为dnew=F(x

4、i+2,yi+1.5)=a(xi+2)+b(yi+1.5)+c而 dold=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+cdnew=dold+a+b= dold-dy+dx在每一步中,根据前一次第二迭中计算出的d值的符号,在正右方和右上方的两个点中进行选择。d的初始值:d0=F(x0+1,y0+0.5)=F(x0,y0)+a+b/2=a+b/2=-dy+dx/2F(x0,y0)=0,(x0,y0)在直线上。为了消除d的分数,重新定义 F(x,y)=2(ax+by+c)则每一步需要计算的dnew 是简单的整数加法dy=y1-y0,dx=x1-x0d0=-2dy+dxdnew

5、=dold-2*dy,当 dold>=0dnew=dold-2(dy-dx),当dold<0Bresenham画线算法算法原理:与DDA算法相似,Bresenham画线算法也要在每列象素中找到与理想直线最逼近的象素点。根据直线的斜率来确定变量在x或y方向递增一个单位。另一个方向y或x的增量为0或1,它取决于实际直线与最接近网格点位置的距离。这一距离称为误差。算法的巧妙构思,使每次只需检查误差项(增量)的符号即可。定义决策变量:d =d+k (0<k<1)设0<k<1,如直线上的一点为(x,y),则下一点为:(x+1,y) (d<0.5) 或(x+1,y

6、+1)(d>=0.5)当d>1时,让d=d-1,以保证0<=d<1,d0=0令e =d-0.5 (0<k<1),则e0 = -0.5则下一点为: (x+1,y),(e<0)(x+1,y+1)(e>=0)当e >0时, 让e =e-1,(重新初始化误差项)由于算法只用到误差项的符号,为了改用整数以避免除法,可以作如下替换:e = 2*e*dx定义决策变量 e = 2*e*dx,则e0 = -dx,e=e +2*dy则下一点为:(x+1,y),(e <0)(x+1,y+1)(e >=0) 当e >0时, 让 e =e -dx,

7、 (重新初始化误差项)实验环境实验条件硬件平台:PC软件(推荐):Windows平台,Visual stdio2013,OpenGL实验步骤实验步骤1. 掌握算法原理;2. 依据算法,编写源程序并进行调试;3. 对运行结果进行保存与分析;4. 把源程序以文件的形式提交;5. 按格式书写实验报告实验内容#include "stdafx.h"#include <glut.h> #include <iostream> #include <cmath> #include<stdio.h>using namespace std;void

8、 init()glClearColor(1.0, 1.0, 1.0, 1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, 200.0, 0.0, 150.0);void IntegerBresenhamline()int x1 = 10, y1 = 10, x2 = 150, y2 = 100;int dx = abs(x2 - x1); int dy = abs(y2 - y1);int x, y;int e = -dx;if (x1 > x2)x = x2;y = y2;x2 = x1;elsex = x

9、1;y = y1;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0);glBegin(GL_LINES);glVertex2i(x, y);while (x < x2)if (e >= 0)y+;e = e - 2 * dx;glVertex2i(x, y);x+; e += 2 * dy;glEnd();glFlush();void MidPointLine()int x, y, x1 = 10, y1 = 10, x2 = 150, y2 = 100;int dy = y1 - y2;int dx = x2 - x1;in

10、t d = 2 * dy + dx;int dx1 = 2 * dy;int dx2 = 2 * (dx + dy);if (x1 > x2)x = x2;y = y2;x2 = x1;elsex = x1;y = y1;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0);glBegin(GL_LINES);glVertex2i(x, y);while (x < x2)if (d<0)y+; x+;d += dx2;elsex+, d += dx1;glVertex2i(x, y);glEnd();glFlush();i

11、nt main(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(50, 100);glutInitWindowSize(400, 300);int choice;printf("输入你想画的直线 0代表Bresenham 1代表中点画线n");while (1)scanf("%d", &choice);switch (choice)case 0:glutCreateWindow("Bresenham Draw Line");init();glutDisplayFunc(IntegerBresenhamline);glutMainLoop();break;case 1:glutCreateWindow("middle Point Line");init();glutDisplayFunc(MidPointLine);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论