基本图形扫描转换(Bresenham画圆)

242 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

一、实验目的及要求

实验要求: 1.理解中点Bresenham算法原理; 2.能用中点Bresenham原理实现基本图形的正确绘制; 3.准确、完整的交互式设计。

二、实验仪器设备与软件环境

Windows 7以上操作系统 Microsoft Visual Studio 2010

三、实验过程及实验结果分析

(包括实验原理、步骤、数据、图表、结果及分析。软件类实验应写出程序代码;硬件类实验画出电路原理图(或逻辑框图)、列出实验数据,并对实验结果进行分析) 主要实验步骤: 创建新项目Test; 同时添加点类,选择“添加”,添加类CP2,虚析构函数 解决方案视图,P2.h:

class CP2  
{
public:
	CP2();
	virtual ~CP2();
	CP2(double,double);
public:
	double x;
	double y;
};

解决方案视图,P2.cpp:

CP2::CP2()
{
	x=0.0;
	y=0.0;
}

CP2::~CP2()
{

}

CP2::CP2(double x,double y)
{
	this->x=x;
	this->y=y;
}

右键添加成员函数; 添加圆中点Bresenham函数MBCircle(double R, CDC* Pdc) 继续添加第二个参数,函数返回类型、函数名都不变,参数类型:CDC*(此处为指针类型,不要漏掉*),参数名:pDC,点击“添加”,再点击“完成”。 在这里插入图片描述

用上述步骤为视图类CTestView继续添加第二个成员函数: void CirclePoint(double x, double y, CDC* pDC); 结果如下图 在这里插入图片描述

打开TestView.cpp,添加画圆函数MBCircle()和八分法画圆函数CirclePoint()

void CTestView::CirclePoint(double x, double y,CDC *pDC)
{
	CP2 pc=CP2((p0.x+p1.x)/2.0,(p0.y+p1.y)/2.0);        
	COLORREF  clr=RGB(0,0,255);                         
	pDC->SetPixelV(Round(x+pc.x),Round(y+pc.y),clr);    
	pDC->SetPixelV(Round(y+pc.x),Round(x+pc.y),clr);     
	pDC->SetPixelV(Round(y+pc.x),Round(-x+pc.y),clr);    
	pDC->SetPixelV(Round(x+pc.x),Round(-y+pc.y),clr);    
	pDC->SetPixelV(Round(-x+pc.x),Round(-y+pc.y),clr);   
	pDC->SetPixelV(Round(-y+pc.x),Round(-x+pc.y),clr);   
	pDC->SetPixelV(Round(-y+pc.x),Round(x+pc.y),clr);    
	pDC->SetPixelV(Round(-x+pc.x),Round(y+pc.y),clr);    

}
void CTestView::MBCircle(double R,CDC *pDC)
{
	double x,y,d;	 
	d=1.25-R;x=0;y=R;
	for(x=0;x<=y;x++)
	{
		CirclePoint(x,y,pDC);
        if (d<0)
			d+=2*x+3;
        else
		{
			d+=2*(x-y)+5;
			y--;
		} 
     }
}

CTestView添加成员变量 1)打开 类视图,右击要添加成员变量的类CTestView,选择 添加/添加变量 2)依次添加三个变量类型和名字。 此时,在CTestView.h中出现了三个新增变量的声明 在这里插入图片描述 此时,在CTestView.h中出现了三个新增变量的声明

protected:
	CP2 p0;
	CP2 p1;
CRect rect; 

3)在TestView.h开头添加 #include “P2.h” 4)在Testview.cpp开头添加下面三项阴影部分

#include "TestDoc.h"
#include "TestView.h"
#include "math.h"
#define  PI 3.1415926
#define Round(d) int(floor(d+0.5))

编辑鼠标响应函数 类视图, 视图类CTestView, 类向导

2点击“消息”,双击WM_LBUTTONDOWN,选择右侧处理程序OnLButtonDown,点击编辑代码 OnLButtonDown函数:

void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
	p0.x=point.x;
	p0.y=point.y;
	p0.x=p0.x-rect.Width()/2;                           
	p0.y=rect.Height()/2-p0.y;
	CView::OnLButtonDown(nFlags, point);
}

继续添加ONLButtonUP,步骤同上。双击WM_LBUTTONUP,

函数OnLButtonUP:

void CTestView::OnLButtonUp(UINT nFlags, CPoint point)
{	p1.x=point.x;
	p1.y=point.y;
	CDC *pDC=GetDC();                                   	pDC->SetMapMode(MM_ANISOTROPIC);                    
	pDC->SetWindowExt(rect.Width(),rect.Height());      
	pDC->SetViewportExt(rect.Width(),-rect.Height());   	pDC->SetViewportOrg(rect.Width()/2,rect.Height()/2);
	rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);  
	p1.x=p1.x-rect.Width()/2;
	p1.y=rect.Height()/2-p1.y;
	double r=sqrt((p1.x-p0.x)*(p1.x-p0.x)+(p1.y-p0.y)*(p1.y-p0.y))/2.0;
	MBCircle(r,pDC);	
	ReleaseDC(pDC);
	CView::OnLButtonUp(nFlags, point);
}

void CTestView::OnDraw(CDC* /*pDC*/)
{
	CTestDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	GetClientRect(&rect);
}

实验结果:

在这里插入图片描述