实验4 实现圆的生成算法之圆心为任意位置的圆的绘制。
一、实验目的
1. 熟悉CDC图形程序库;
2. 掌握中点画圆生成算法;
3. 掌握Bresenham画圆算法。
二、实验内容
利用VisualC++6.0设计一个简易画圆绘图板,验证圆生成算法。
下面是步骤:
首先创建多文档,之后的步骤实验二已经说了。
第一步:在Header Files 文件夹中找到Draw_CirView.h(我的工程名叫Draw_Cir)头文件打开,先声明一个变量m_nDrawType来保存用户所选的哪个算法。
class CDraw_CirView : public CView
{
private: UINT m_nDrawType;
protected: // create from serialization only
CDraw_CirView();
DECLARE_DYNCREATE(CDraw_CirView)
// Attributes
'
'
'
第二步:在Source Files 文件夹中找到Draw_CirView.cpp(我的工程名叫Draw_Cir),打开。在CDraw_CirView的构造函数中将m_nDrawType赋值为0。
CDraw_CirView::CDraw_CirView()
{
// TODO: add construction code here
m_nDrawType=0;
}
第四步:和做第二个实验一样,代码分别是下面的:
void CDraw_CirView::OnBre()
{
// TODO: Add your command handler code here
m_nDrawType=1;
}
void CDraw_CirView::OnMid()
{
// TODO: Add your command handler code here
m_nDrawType=2;
}
第五步要:创建一个鼠标左键按下的响应函数OnLButtonDown(UINT nFlags, CPoint point) (实验二已经介绍怎么用了)这个函数的代码如下:
void CDraw_CirView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
switch (m_nDrawType)
{
case 1: //bresenham画圆
{
CDC*pDC=GetDC();//得到绘图类指针
RedrawWindow();//重绘窗口(这个东西就是控制你的圆画第二次是否覆盖)
int x,y,x0=point.x,y0=point.y,r=50;//圆的圆心为(x0,y0),半径为r
int delta,delta1,delta2,direction;
x=0;y=r;
delta=2*(1-r);
while(y>=0)
{
pDC->SetPixel(x+x0,y+y0,RGB(0,0,255));
pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255));
pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255));
pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255));
if(delta<0)
{
delta1=2*(delta+y)-1;
if(delta<=0)direction=1;
else direction=2;
}
else if(delta>0)
{
delta2=2*(delta-x)-1;
if(delta2<=0)direction=2;
else direction=3;
}
else direction=2;
switch(direction)
{
case 1:x++;
delta+=2*x+1;
break;
case 2:x++;y--;
delta+=2*(x-y+1);
break;
case 3:y--;
delta+=(-2*y+1);
break;
}
}
}
break;
case 2: //中点画圆
{
CDC*pDC=GetDC();//得到绘图类指针
//RedrawWindow();//重绘窗口(这个东西就是控制你的圆画第二次是否覆盖)
int x,y,x0=point.x,y0=point.y,r=100;//圆的圆心为(x0,y0),半径为r
float d;
x=0;
y=r;
d=(float)1.25-r;
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));
while(x<=y)
{
if(d<0)
{
d=d+2*x+3;
x++;
}
else
{
d=d+2*(x-y)+5;
x++;
y--;}
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));
}
break;
}
}
CView::OnLButtonDown(nFlags, point);
}
不懂得可以评论(我不一定说的清楚)。
我的QQ:2993016261(小号)。