实验1 中点画线和Bresenham画线算法的实现 下载本文

内容发布更新时间 : 2024/5/1 10:11:00星期一 下面是文章的全部内容请认真阅读。

{ while(x

pDC->SetPixel(x,y,color); } } else { while(x

pDC->SetPixel(x,y,color); } } }// if( |k|<=1 ) else // |k|>1 { if(y<=y1) { while(xSetPixel(x,y,color); } } else { while(xSetPixel(x,y,color); } } }// else( |k|>1 )

}// else 斜率k为有限值 ReleaseDC(pDC); }

// 算法: Bresenham画线

// 输入: 起点(x0,y0),终点(x1,y1); // 输入要求x0<=x1;

void CTestView::BresenhamLine( int x0, int y0, int x1, int y1, int color ) { CDC * pDC=GetDC(); int x,y,dx,dy,e; dx=x1-x0; dy=y1-y0; e=-dx;

x=x0;y=y0; while(x<=x1)

{ pDC->SetPixel(x,y,color);

x++;

e=e+2*dy; if(e>0) {y++; e=e-2*dx; } } }

void CTestView::OnMenuclearview() { // TODO: Add your command handler code here m_X0=0; m_Y0=0; m_X1=0; m_Y1=0; RedrawWindow();//重绘窗口 }

// 打开过去保存的文件,该文件包含直线的端点坐标 void CTestView::OnFileOpen() { // TODO: 在此添加命令处理程序代码 if( m_nFlag!=1 && m_nFlag!=2 ) { MessageBox(\请先在菜单中选择绘制直线的方法!\提示\ return; } CFileDialog dlgFile (TRUE, _T(\ OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, _T(\线段端点坐标文件(*.txt)|*.txt||\ if( IDOK == dlgFile.DoModal()) {

CString fileName = dlgFile.GetFileName(); ifstream rFile; rFile.open(fileName,ios::in); if ( ! rFile.is_open() ) { MessageBox(\文件打开失败!\提示\ARNING); return; } CString strLine0; string strLine; int nX,nY; // 起点、终点,两个坐标 rFile>>strLine; strLine0 = strLine.c_str(); nX = atoi( strLine0.Left( strLine0.Find(\// 解析文件,如“220,221”表示一个点的x、y坐标 nY = atoi( strLine0.Mid( strLine0.Find(\ m_X0 = nX; m_Y0 = nY; rFile>>strLine; strLine0 = strLine.c_str(); nX = atoi( strLine0.Left( strLine0.Find(\ nY = atoi( strLine0.Mid( strLine0.Find(\ m_X1 = nX; m_Y1 = nY; RedrawWindow(); rFile.close(); } }

// 保存当前视图上绘制的所有直线的端点坐标 void CTestView::OnFileSave() { // TODO: 在此添加命令处理程序代码 CFileDialog dlgFile(FALSE, _T(\_T(\OFN_OVERWRITEPROMPT, _T(\线段端点坐标文件(*.txt)|*.txt||\ if( IDOK == dlgFile.DoModal()) // 保存文件 { CString strFileName = dlgFile.GetFileName(); // 包含完整路径的文件名称 ofstream wFile; wFile.open(strFileName,ios::out|ios::ate|ios::app);

if ( ! wFile.is_open() ) { MessageBox(strFileName+\文件创建失败!\提示\ARNING); return; }

wFile<

五. 实验心得及建议

实验心得:Bresenham算法是一种很方便很实用很简单的算法,它对任意斜率的直线段具有通用性。对于斜率为正且大于1的直线段,只需交换x和y之间的规则。对于负斜率,除了一个坐标递减而另一个坐标递增外,其余的程序是类似的。另外,水平、垂直和斜率的绝对值为1的直线可以直接装入帧缓冲储存器而无须进行画线算法处理。 建议:这个程序还不是最简单的,还有改进的空间,希望能把程序变得更简洁些。