持续创作,加速成长!这是我参与「掘金日新计划 · 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);
}
实验结果: