VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

时间:2024-04-04 08:56:03

第一次接触计算机图形学这东西,也是第一次用vc++6.0这个(zao xin de)软件,鉴于网上这块的学习资料太少了,把自己摸索的一些入门的操作写下来教给大家。

 

这篇文章主要是教大家如何使用VC++6.0来搭配算法进行画线、画圆。先展示一下我写好的效果图,如果不是你想要的,请绕路:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

就简单展示这两个,其他的都是一样的,只是算法不同而已!!!需要我这个工程的,下面有链接哦!

 

如果上述功能是你想找的,那么就请跟着我一起来吧!

 

总体步骤:观察算法,确定变量 -> 建立对话框 -> 编写菜单 -> 建立菜单对话框消息映射 -> 编写算法

首先当然是安装VC++6.0(当然有VS的也可以啦,这里拿VC++6.0做演示吧,如果两个软件都没有,这里给你一个:https://www.lanzous.com/i5zbvpc

 

  • 观察算法,确定变量

打开软件,新建项目

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

因步骤都差不多,这里就只拿Bresenham画圆算法来做示范吧!

 

新建好项目后,先观察你的算法,Bresenham算法如下(至于原理,请翻阅其他资料,这里不做解释):

void circleBre(int x0, int y0, double circleBreR)

{

    // TODO: Add your command handler code here

    double x,y,d;

    x=0;

    y=(int)circleBreR;

d=int(3-2*circleBreR);

COLORREF rgb=RGB(0,0,225); //添加画笔颜色

    while(x<y){

        circlePoint(x0,y0,x,y,rgb);

        if(d<0){

            d=d+4*x+6;

        }else{

            d=d+4*(x-y)+10;

            y--;

        }

        x++;

    }

    if(x==y){

        circlePoint(x0,y0,x,y,rgb);

    }

}

void circlePoint(int x0, int y0, int x, int y, int rgb)

{

    // TODO: Add your command handler code here

    CClientDC dc(this); //添加上下文,确定画布

 

    dc.SetPixel(x0+x, y0+y, rgb);

    dc.SetPixel(x0+y, y0+x, rgb);

    dc.SetPixel(x0+y, y0-x, rgb);

    dc.SetPixel(x0+x, y0-y, rgb);

    dc.SetPixel(x0-x, y0-y, rgb);

    dc.SetPixel(x0-y, y0-x, rgb);

    dc.SetPixel(x0-y, y0+x, rgb);

    dc.SetPixel(x0-x, y0+y, rgb);

}

可以看到,x0,y0是圆心坐标,circleBreR是圆的半径。因此我们需要的是输入这三个参数,可以把它们写成全局参数,并且画笔颜色rgb也可以后面定义,函数部分就可以少调用很多参数了(多了参数,怕乱),改写后的函数如下:

void circleBre()

{

    // TODO: Add your command handler code here

    double x,y,d;

    x=0;

    y=(int)circleBreR;

    d=int(3-2*circleBreR);

    while(x<y){

        circlePoint(x,y);

        if(d<0){

            d=d+4*x+6;

        }else{

            d=d+4*(x-y)+10;

            y--;

        }

        x++;

    }

    if(x==y){

        circlePoint(x,y);

    }

}

void circlePoint(double x, double y)

{

    // TODO: Add your command handler code here

    CClientDC dc(this); //添加上下文,确定画布

    COLORREF rgb=RGB(0,0,225); //添加画笔颜色

 

    dc.SetPixel(x0+x, y0+y, rgb);

    dc.SetPixel(x0+y, y0+x, rgb);

    dc.SetPixel(x0+y, y0-x, rgb);

    dc.SetPixel(x0+x, y0-y, rgb);

    dc.SetPixel(x0-x, y0-y, rgb);

    dc.SetPixel(x0-y, y0-x, rgb);

    dc.SetPixel(x0-y, y0+x, rgb);

    dc.SetPixel(x0-x, y0+y, rgb);

}

好了,观察好你所需要的输入参数:圆心坐标x0,y0,半径R,可以来设计了:

  • 建立对话框:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

分别拖出四个静态文本框(Aa)和三个编辑框(ab|)

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

选中一个,右键属性!!!(千万不要去双击,这里的双击可不是你想要的效果)。

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

然后,在标题这输入显示文字(其他的静态文本框Static都一样),输入完后:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

文本框弄好了,来修改编辑框,一样的选中一个编辑框,右键选择属性,修改ID

X:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

Y:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

R:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

然后,如果看不惯这个排版,可以选中各对象,拖动或者方向键移动它们,我就简单地这样排了:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

以上操作完成后,在对话框任意空白位置,双击,会弹出对话框,选择OK

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

为对话框建立变量:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

添加变量:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

创建好后,正常显示这样的,然后点击下面的“确定”:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

 

 

  • 编写菜单

对话框建立好了,现在可以修改菜单了:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

输入菜单标题

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

编写子菜单

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

  • 建立消息映射

以上两步可以颠倒顺序,上述两步建立好后,最重要的一步是“建立消息映射”。

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

以下操作务必按照序号来:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

然后确定

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

编写函数

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

添加头文件

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

测试:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

点击“感叹号”编译运行:
点击子菜单,出现弹出框表示正常:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

  • 写入算法

打开testView.h,建立全局变量:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

回到“testView.h”给全局变量进行赋值:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

编写算法函数(这里我就直接用现成的,由上面的改了下精度):

将下面的函数代码粘贴到上述函数的下面

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

void CTestView::circleBre()

{

    // TODO: Add your command handler code here

    int x,y,d;

    x=0;

    y=R;

    d=3-2*R;

    while(x<y){

        circlePoint(x,y);

        if(d<0){

            d=d+4*x+6;

        }else{

            d=d+4*(x-y)+10;

            y--;

        }

        x++;

    }

    if(x==y){

        circlePoint(x,y);

    }

}

void CTestView::circlePoint(int x, int y)

{

    // TODO: Add your command handler code here

    CClientDC dc(this); //添加上下文,确定画布

    COLORREF rgb=RGB(0,0,225); //添加画笔颜色

 

    dc.SetPixel(x0+x, y0+y, rgb);

    dc.SetPixel(x0+y, y0+x, rgb);

    dc.SetPixel(x0+y, y0-x, rgb);

    dc.SetPixel(x0+x, y0-y, rgb);

    dc.SetPixel(x0-x, y0-y, rgb);

    dc.SetPixel(x0-y, y0-x, rgb);

    dc.SetPixel(x0-y, y0+x, rgb);

    dc.SetPixel(x0-x, y0+y, rgb);

}

 

当然,在这里写了函数,需要去“testView.h”进行函数声明:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

上面的都做好了,那就运行吧!

输入参数:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

运行结果:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

大功告成!!!

其他的都类似了,大家尝试着动手做做呀!!!

 

需要我这两个工程的,下面是链接哦:

土豪链接://download.csdn.net/download/changfeng1998/11964897

非土豪链接:https://www.lanzous.com/i7cwc4h

如何打开工程呢?

选择菜单文件->打开

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线

 

找到你要打开的文件路径:

VC++6.0新手如何使用MFC实现Bresenham算法画圆、画线