计算机图形学实验指导书电子版(8)

2018-12-27 19:01

任务三、加入鼠标功能,实现交互式画直线

第一步:建立DDAMouseLine工程文件; 第二步:向视图类中添加自定义的成员变量

用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。 proctected :

CPoint m_p1; // 起点 CPoint m_p2; //终点

int m_ist; //区别,m_ist=0,表示直线起点, //m_ist=1,表示直线终点 第三步:向视图类中添加自定义的成员函数原型: public:

void DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color);

第四步:在视图类CPP文件的构造函数中初始化成员变量。

视图类的构造函数名与该视图类的名字相同。在视图类中选择构造函数,如:CDDAMouseLineView(),用鼠标左键双击,输入下面程序代码: CDDAMouseLineView::CDDAMouseLineView() { // TODO: add construction code here m_p1.x=0; m_p1.y=0; //起点 m_p2.x=0; m_p2.y=0; //终点

m_ist=0; //0,第1点;1,第2点; }

第五步:在视图类的OnDraw()函数中加入下列代码,实现视图绘图。 void CMouseSpringView::OnDraw(CDC* pDC) { CMouseSpringDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

// TODO: add draw code for native data here pDC->SelectStockObject(NULL_BRUSH); DDAMouseLine(pDC,m_p1.x,m_p1.y,m_p2.x,m_p2.y,RGB(255,0,0)); // 调用自定义的成员函数,用鼠标画直线 }

第六步:向视图类中添加鼠标OnLButtonDown()函数消息响应函数,并输入鼠标处理程序代码。

void CMouseSpringView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

pDC->SelectStockObject(NULL_BRUSH); if (!m_ist) //是起点 {

-- 36

m_p1=m_p2=point; //纪录第一次单击鼠标位置,定起点 m_ist++; } else { m_p2=point; //记录第二次单击鼠标的位置,定终点的点 m_ist--; // 为新绘图作准备 DDAMouseLine(pDC,m_p1.x,m_p1.y,m_p2.x,m_p2.y,RGB(255,0,0)); //绘制新直线 } ReleaseDC(pDC); //释放设备环境 CView::OnLButtonDown(nFlags, point); }

第七步:添加成员函数的程序代码。

void CDDAMouseLineView::DDAMouseLine(CDC *pDC, int x0, int y0, int x1, int y1, COLORREF color) {

int length,i; float x,y,dx,dy; length=abs(x1-x0); if (abs(y1-y0)>length) length=abs(y1-y0);

dx=(float)(x1-x0)/length; dy=(float)(y1-y0)/length; x=x0+0.5;y=y0+0.5; for (i=1;i<=length;i++) { pDC->SetPixel((int)x,(int)y,color); x=x+dx;y=y+dy; } //pDC->MoveTo(x0,y0); //pDC->LineTo(x1,y1); }

第八步:编译运行程序,验证运行结果。

程序改进,添加橡皮筋绘图技术,实现交互式画直线。

向视图类中添加鼠标OnMouseMove ()函数消息响应函数,并输入鼠标处理程序代码。 void CDDAMouseLineView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC();

int nDrawmode=pDC->SetROP2(R2_NOT); //设置异或绘图模式,并保存原来绘图模式 pDC->SelectStockObject(NULL_BRUSH); if(m_ist==1)

-- 37

{ CPoint prePnt,curPnt; prePnt=m_p2; //获得鼠标所在的前一位置 curPnt=point; //绘制橡皮筋线 DDAMouseLine(pDC,m_p1.x,m_p1.y,prePnt.x,prePnt.y,RGB(255,0,0)); //DrawCircle(pDC,m_bO,prePnt); //用异或模式重复画圆,擦出所画的圆 DDAMouseLine(pDC,m_p1.x,m_p1.y,curPnt.x,curPnt.y,RGB(255,0,0)); //DrawCircle(pDC,m_bO,curPnt); //用当前位置作为圆周上的点画圆 m_p2=point; } pDC->SetROP2(nDrawmode); //恢复原绘图模式 ReleaseDC(pDC); //释放设备环境 CView::OnMouseMove(nFlags, point); }

四、实验结果和分析

1. 查看实验结果,验证算法的正确性;

2. 对程序进行分析和比较,你还能提出哪些改进和扩充?例如:

(1)线刷子绘制直线和圆; (2)方形刷子绘制直线和圆; (3)虚线和点划线的绘制;

五、实验总结

总结从本次实验中学到了那些知识点或者有哪些感受?

-- 38

实验三 基本图形(元)生成技术(二)

圆、椭圆生成算法

一、实验目的

编写圆和椭圆的扫描转换算法程序,验证算法的正确性。

二、实验任务

1. 编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动; 2. 添加鼠标程序,实现交互式画圆; 3. 编写中点画椭圆法的扫描转换程序; 4. 添加鼠标程序,实现交互式画椭圆;

三、实验内容

任务一:中点画圆法的扫描转换算法

编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;

分析:考虑圆心不再原点,设圆心坐标为(x0,y0)。通过平移坐标原点到圆心,则第二个8分圆上一点p(x,y),其原始坐标为 x’=x+x0 y’=y+y0

即p’1(x0 +x, y+y0)

其它7个对称点分别是:p’2(x0+y,y+x0), p’3 (x0+y,y0-x),p’4 (x0+x,y0-y),p’5 (x0-x,y0-y),p’6 (x0-y,y0-x),p’7 (x0-y,y0+x),p’8 (x0-x,y0+y)

p’1(x0 +x, y+y0) Y’ Y 算法程序如下:

p(x,y)

MidpointCircle(int x0,int y0,int r, int color) p’8 (x0-x,y0+y) R {

p’2(x0+y,y+x0) int x,y; p’7 (x0-y,y0+x) float d;

(x0,y0) X’ x=0;y=r;d=1.25-r;

p’6 (x0-y,y0-x) CirPot(x0,y0,x,y,color); p’3 (x0+y,y0-x) while (x<=y)

{

if(d<0)

p’5 (x0-x,y0-y) O(0,0) p’4 (x0+x,y0-y)) X -- 39

(x0+R,y0)

{

d+=2*x+3; x++; } else {

d+=2*(x-y)+5; x++; y--; }

CirPot(x0,y0,x,y,color); } /* while*/

} /* MidpointCiecle */

int CirPot(int x0,int y0,int x,int y,int color) {

Setpixel((x0+x),(y0+y)); Setpixel((x0+y),(y0+x)); Setpixel((x0+y),(y0-x)); Setpixel((x0+x),(y0-y)); Setpixel((x0-x),(y0-y)); Setpixel((x0-y),(y0-x)); Setpixel((x0-y),(y0+x)); Setpixel((x0-x),(y0+y)); }

程序实现步骤:

(1) 建立MidPointCircle工程文件;

(2) 右击CMidPointCircleView类,建立成员函数

void MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) int CirPot(CDC *pDC,int x0, int y0, int x, int y, COLORREF color) (3) 编写成员函数代码,程序如下:

void CMidPointCircleView::MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) {

int x,y; float d;

x=0;y=r;d=1.25-r;

CirPot(pDC,x0,y0,x,y,color); while (x<=y) {

if(d<0) {

d+=2*x+3; x++; } else {

d+=2*(x-y)+5;

-- 40


计算机图形学实验指导书电子版(8).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:【精品】2018年高考语文非连续性文本阅读

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: