图形学-绘制任意斜率的直线段

图形学-绘制任意斜率的直线段


2023年12月11日发(作者:华为畅玩4c)

《计算机图形学》实验设计报告

实验二 绘制任意斜率的直线段

一、 实验目的

1、掌握任意斜率直线段的中点Bresenham 的扫描转换算法。

2、掌握Cline 直线类的设计方法。

3、掌握状态栏编辑方法。

二、实验要求

1、设计CLine 直线类,其数据成员为直线段的起点坐标(x0,y0)和直线段的斜率k,其对应的成员函数为 MoveTo()和LineTo() 函数。

2、在Cline类中绘制直线段斜率为 [-1,0]区间类的直线。

3、在MoveTo()函数中对应的参数为起始点的坐标,在LineTo()函数中对应的参数为CDC 和直线段的斜率。

三、 设计Cline直线类

在CDC类的成员函数中有MoveTo()和LineTo()函数用于绘制任意斜率的直线段,直线的颜色由所选用的画笔指定。 利用任意斜率直线段的中点Bresenham算法,可以分析得出,当直线段的斜率-1k0时,对应的初始值为

d-0.5-k,对应的误差项为dyi-0.5-k(xi1)-b ,判别条件为:

y-1,d0d-1-k,d0 ,递推公式为

di1i

yi1iyi,d0di-k,d0 以此条件,即可在 中用循环语句绘制直线。

四、程序运行的核心代码

1、首先建立一个Cline类,并且在Line.h中写出如下代码:

class CLine

{

public:

CLine();

virtual ~CLine();

void MoveTo(double x,double y);

void LineTo(CDC *,double k);

2 private:

double x;

double y;

double k;

};

2、在中书写如下代码,并要加头文件 #include "Line.h"

CLine::CLine()

{ }

CLine::~CLine()

{ }

void CLine::MoveTo(double x0,double y0)

{

this->x=x0;

this->y=y0;

}

void CLine::LineTo(CDC *pDC,double k){

double d;

double x0=0.0,y0=0.0;

d=-0.5-k;

for(int i=0;i<100;i++){

if(d>0)

{ y0--;

3 d-=1+k;

}

else

d-=k;

x0++;

pDC->SetPixel(x0,y0,RGB(255,0,0));

}

}

3、在sourcefile中"TestView.h"下的OnDraw 函数中输入如下代码

void CMFCView::OnDraw(CDC* pDC)

{

CMFCDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CRect rc;

GetClientRect(&rc);// 对坐标原点的映射

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetWindowExt((),());

pDC->SetViewportExt(,-);

pDC->SetViewportOrg(/2,/2);

CLine s;

(1.0,1.0);

(pDC,-0.6);

4

五、程序运行结果及图形界面

六、心得体会

这次实验是通过Cline 类来绘制直线,利用直线段的起点、斜率和两成员函数MoveTo()、LineTo()对直线在斜率为-0.6时,作出了直线的图形。在实验过程中,最先想用书上的方法即直线的两点式来绘制图形,但发现很复杂,在老师的指导下用直线的起点和斜率来绘制图形,代码很简单,效果也较好。更深刻的体会到,在程序设计语言中,应选择最合适的方法来实现题目要实现的功能,尽量使代码简便,以便于及时完成实验要求。另外,当把源程序保存在文件夹

5 中时,再次在文件夹中使用时,总有错误,这是一个不会解答的问题?

6


发布者:admin,转转请注明出处:http://www.yc00.com/num/1702279971a1196363.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信