MFC计算机图形学(3)

之前我们已经可以画出直线和曲线了。但是算法虽容易理解,但是复杂度高,今天就介绍比较流行的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;iSetPixel(x, y, color);
        x = x+dx;
        y = y+dy;
    } 
}

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

鼠标事件

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

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

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));
}

效果如下:
MFC计算机图形学(3)_第3张图片

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

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));

效果如下
MFC计算机图形学(3)_第4张图片

打完收工。。。

你可能感兴趣的:(计算机图形学)