实验四 使用C++的mfc实现圆心为任意位置的圆的绘制。

实验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(小号)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值