实验1 中点画线和Bresenham画线算法的实现
更新时间:2023-10-03 05:23:01 阅读量: 综合文库 文档下载
- 实验1号马铃薯种薯简介推荐度:
- 相关推荐
计算机图形学实验报告
实验1 使用画线算法,绘制直线段
姓名 杜艾莲 系别班级 地信101 学号 1008140925 实验日期 2011.10.10 指导教师 实验成绩 一. 实验目的及要求
(1)掌握图形学中常用的三种画线算法:数值微分法、中点画线法和Bresenham画线算法。 (2)掌握绘制直线的程序设计方法。
(3)掌握使用文件来保存直线段的方法。 (4)掌握从文本文件中恢复出直线的方法。
二. 实验内容
使用VC++ 6.0开发环境,分别实现中点画线算法和Bresenham画线算法,绘制直线(注意,不能使用VC中已有的绘制直线的函数),并以文本文件的形式保存绘制的结果,可以从文本文件中恢复出以前绘制过的直线。
三. 算法设计与分析
输入P0(X0,Y0) 和P1(X1,Y1) 计算初始值△x,△y d=△x-2△y,x=X0,y=Y0 (x,y) 更新为(x+1,y+1),d更新为d+2△x-2△y (x,y)更新为(x+1,y),d更新为d-2△y 结束
Bresenham算法绘制直线的程序(仅包含整数运算)。 void MidBresenhamLine(int x0,int y0,int x1,int y1,int color) {
int dx,dy,d,UpIncre,DownIncre,x,y; if(x0>x1){
x=x1;x1=x0;x0=x;
y=y1;y1=y0;y0=y; }
x=x0;y=y0;
dx=x1-x0;dy=y1-y0; d=dx-2*dy;
UpIncre=2*dx-2*dy;DownIncre=-2*dy; while(x<=x1){ putpixel(x,y,color); X++; if(d<0){ y++;
d+=UpIncre; }
else d+=DownIncre; } }
四. 程序调试及运行结果的自我分析与自我评价
// testView.cpp : implementation of the CTestView class #include \#include \#include \#include \#include
#include
#include \//CDlgInput类的头文件
using namespace std; #ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
// CTestView
IMPLEMENT_DYNCREATE(CTestView, CView)
BEGIN_MESSAGE_MAP(CTestView, CView) //{{AFX_MSG_MAP(CTestView) ON_COMMAND(ID_MENUITEM32771, OnMenuitem32771) ON_COMMAND(ID_MENUBRESENHAMLINE, OnMenubresenhamline) ON_COMMAND(ID_MENUCLEARVIEW, OnMenuclearview) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_COMMAND(ID_FILE_SAVE, OnFileSave) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP()
// CTestView construction/destruction
CTestView::CTestView() { // TODO: add construction code here m_nFlag = -1; // 不是任何绘图类型 }
CTestView::~CTestView() { }
BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); }
// CTestView drawing
void CTestView::OnDraw(CDC* pDC) { CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here if(1==m_nFlag) // 中点画线 { MidPointLine(m_X0, m_Y0, m_X1, m_Y1, RGB(255,0,0) ); } else if(2==m_nFlag) // Bresenham画线 { BresenhamLine(m_X0, m_Y0, m_X1, m_Y1, RGB(0,255,0) ); } }
// CTestView printing
BOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); }
void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing }
void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing
}
// CTestView diagnostics #ifdef _DEBUG
void CTestView::AssertValid() const { CView::AssertValid(); }
void CTestView::Dump(CDumpContext& dc) const { CView::Dump(dc); }
CTestDoc* CTestView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc))); return (CTestDoc*)m_pDocument; }
#endif //_DEBUG
// CTestView message handlers
void CTestView::OnMenuitem32771() { // TODO: Add your command handler code here m_nFlag = 1; // 中点画线 CDlgInput dlg; if(IDOK==dlg.DoModal()) { m_X0=dlg.m_nX0; m_Y0=dlg.m_nY0; m_X1=dlg.m_nX1; m_Y1=dlg.m_nY1; RedrawWindow(); //重绘窗口 } }
void CTestView::OnMenubresenhamline() { // TODO: Add your command handler code here m_nFlag = 2; // Bresenham画线 CDlgInput dlg; if(IDOK==dlg.DoModal()) { m_X0=dlg.m_nX0; m_Y0=dlg.m_nY0; m_X1=dlg.m_nX1; m_Y1=dlg.m_nY1; RedrawWindow(); //重绘窗口
} }
// 算法: 中点画线
// 输入: 起点(x0,y0),终点(x1,y1); // 输入要求x0<=x1;
void CTestView::MidPointLine( int x0, int y0, int x1, int y1, int color ) { CDC * pDC=GetDC(); int a,b,d0,d1,d2,d3,d4,d5,d,x,y; a=y0-y1; b=x1-x0; // 之前的设置已经保证始终有x1>=x0 d=2*a+b; d0=2*a-b; d1=2*a; d2=2*(a+b); d3=2*b; d4=2*(a-b); d5=a-2*b; x=x0; y=y0; pDC->SetPixel(x,y,color); if(x==x1) // 斜率k为无穷大 { if(y<=y1) { while(y<=y1) { pDC->SetPixel(x,y,color); y++; } } else { while(y>=y1) { pDC->SetPixel(x,y,color); y--; } } }// if 斜率k为无穷大 else // 斜率k为有限值 { // double k=-a/b; // if( k+1>1e-6 && k-1<1e-6 || fabs(k-1)<1e-6 || fabs(k+1)<1e-6) // |k|<=1(即:-1<= k <=1),与1e-6比较是浮点数比较方法 if( -b<=-a && -a<=b ) // 用浮点数比较在|k|=1.0f时容易出问题,所以直接用整数比较(将斜率k转换为a与b的比较;之前的设置已经保证b为正数) { if(y<=y1)
正在阅读:
实验1 中点画线和Bresenham画线算法的实现10-03
E区11月党组织生活总结08-17
电影与幸福感2019尔雅答案100分01-16
小学生一年级看图作文下册06-14
(完整版)基于单片机的霓虹灯控制器的设计毕业论文 - 图文01-07
(试卷合集)吉林省2019届化学中考模拟试题12套试卷合集含答案07-07
吃饭作文50字02-04
未来学校作文450字06-29
2019小学生一年级好家风好家训征文06-14
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 点画
- 算法
- Bresenham
- 实验
- 实现
- 探析《聊斋志异》中花妖狐魅形象的艺术特色 - 论狐女的人性美
- 论述题
- 建筑施工现场安全管理的现状与对策浅析
- LTE空口信令流程详解
- 慈溪市工业发展“十二五”规划
- 2010年注册税务师考试《税法一》全真模拟试卷(4)-中大网校
- 企业党员如何在争创一流中发挥作用
- 环境温度对涡轮增压器的影响
- 家访记录
- 二值图像游程编码算法的Matlab实现
- 青岛版三年级科学下册期中试题及答案(最新)
- 设备安装通知函(A版)CST
- 作文的题记
- 关于增加800MHz频段微功率(短距离)无线电应用工作频率的通知
- 自控报告1
- 5 传递系数法
- 放开“沿海捎带”业务对天津港的影响探讨讲义
- 安徽省马鞍山市第二中学2013届高三上学期期中考试(政治) - 图文
- 工程力学B
- 六年级数学下册 5.1《线段、射线、直线》练习 鲁教版五四制