MFC计算机图形学(3)

来源:互联网 发布:淘宝发布宝贝上限 编辑:程序博客网 时间:2024/06/18 04:00

之前我们已经可以画出直线和曲线了。但是算法虽容易理解,但是复杂度高,今天就介绍比较流行的DDA画线法,还有,对鼠标进行事件有所响应,即,在画板上,鼠标左键单击,移动至另外一个地方松开,此时在这两个点之间画一条线。

DDA画线

算法代码

void DDA_Line(int x1, int y1, int x2, int y2, int color){    CDC *pDC = GetDC();//获取设备环境    int  k,i; float x, y, dx, dy;    k = abs(x2-x1);    if (abs(y2-y1)>k)     {        k = abs(y2-y1);    }    dx = float(x2-x1)/k;    dy = float(y2-y1)/k;    x=x1;    y=y1;    for (i=0;i<k;i++)    {        pDC->SetPixel(x, y, color);        x = x+dx;        y = y+dy;    } }

网上好多人画图解释说明,这里我就不说了。
下面就是处理鼠标事件

鼠标事件

我们先添加四个成员变量x1,y1,x2,y2表示线段端点坐标
添加完如下图
这里写图片描述
在菜单栏
view(视图) –> 鼠标事件 – >右边Class name 选择CXXXView(注:XXX为你的项目名)–>在Messages:找到WM_LBUTTONDOWN 双击或者先单击,再在右边选择Add Function
最后点击Edit Code
如图
这里写图片描述

这是鼠标单击响应事件函数,我们编辑代码:

void OnLButtonDown(UINT nFlags, CPoint point) {    // TODO: Add your message handler code here and/or call default    CView::OnLButtonDown(nFlags, point);    x1 = point.x;    y1 = point.y;}

按照上面的方法步骤,继续添加鼠标左键松开的响应事件。
同时即可画出线段。

void OnLButtonUp(UINT nFlags, CPoint point) {    // TODO: Add your message handler code here and/or call default    CView::OnLButtonUp(nFlags, point);    x2 = point.x;    y2 = point.y;    DDA_Line(x1,y1,x2,y2,RGB(255,0,0));}

效果如下:
这里写图片描述

下面,我们以所画的线段为对角线,画一个矩形。
这个也很简单,自己画个图,就可以写出代码

DDA_Line(x1,y1,x2,y1,RGB(0,255,0));DDA_Line(x1,y1,x1,y2,RGB(0,255,0));DDA_Line(x1,y2,x2,y2,RGB(0,255,0));DDA_Line(x2,y1,x2,y2,RGB(0,255,0));

效果如下
这里写图片描述

打完收工。。。

原创粉丝点击