MFC计算机图形学
VC++ 安装
VC++我基本不用的,平时写C/C++的代码都用Code::Blocks.
VC++基本都是绿色版,下载解压就可以用了,但是在中国,你知道的,下载安装的时候注意一点。(你知道的)
下载解压完,打开
\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE
- 1
正常情况下双击那个文件就可以打开vc++,
但是,却发现下面那个错误。。。。。
没错,就是那个错误,查了一下,原来是那个文件有问题,重新下一个替换才可以。好吧,重新去弄。
一番解决之后,终于可以了。
解决方法
开始绘图
打开VC++,新建一个MFC ApWizard(exe)工程,如图
这里,我将工程取名demo,确定即可。
下面选择单文档,选择完成即可。如图
下面就进入了项目。如图。
在CDemoView下面找到OnDraw(CDC *pDC)方法,就可以在下面写代码了。
注意
MFC文件 命名有点奇怪,它在每一个类前面都加了一个大写字母C
下面,定位到OnDraw()开始写代码。
pDC->SetPixel(x,y,RGB(255,0,0));
- 1
上面那行代码的意思是在(x,y)绘制一个红色(RGB(255,0,0))的像素点。
其颜色是根据RGB值来确定的。
下面为了显示效果,绘制一条红色的从(0,0)到(100,100)的线段来看一下效果。
代码如下:
void CDemoView::OnDraw(CDC* pDC)
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
for(int q=0;q<100;q++)
{
pDC->SetPixel(q,q,RGB(255,0,0));
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
效果如下.
注意
画图的时候,界面上的坐标,原点在走上角,水平向右是x坐标,竖直向下是y坐标。极大多数程序画图都是这样的,和数学有点不一样,注意区分。
下面画一条水平的线段。
下面来画一个正方形吧。
效果如下:
代码如下:
void CDemoView::OnDraw(CDC* pDC)
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
for(int i=0;i<200;i++)//水平的两条边
{
pDC->SetPixel(i+100,100,RGB(255,0,0));
pDC->SetPixel(i+100,300,RGB(255,0,0));
}
for(int j=0;j<200;j++)//竖直的两条边
{
pDC->SetPixel(100,j+100,RGB(255,0,0));
pDC->SetPixel(300,j+100,RGB(255,0,0));
}
}
下面我们在正方形内画一个绿色的内切圆。
圆的话我们用参数方程来画图。
设圆的圆心为(x0,y0),半径为 r
则参数方程为:
x = x0 + r * cos(sita);
y = y0 + r * sin(sita);
0 <= sita <= 2 * pi;
注意,要引入math头文件
#include <cmath>
- 1
下面就可以画圆了,注意 sita 的范围是0 <= sita <= 2*pi,步长为1.0/r
下面就可以画图了。
先看效果:
代码:
“`c++
void CDemoView::OnDraw(CDC* pDC)
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
for(int i=0;i<200;i++)//水平的两条边
{
pDC->SetPixel(i+100,100,RGB(255,0,0));
pDC->SetPixel(i+100,300,RGB(255,0,0));
}
for(int j=0;j<200;j++)//竖直的两条边
{
pDC->SetPixel(100,j+100,RGB(255,0,0));
pDC->SetPixel(300,j+100,RGB(255,0,0));
}
int r = 100;
double pi = acos(-1);
for(double s=0;s<2*pi;s+=1.0/r)
{
int x=200+r*cos(s);
int y=200+r*sin(s);
pDC->SetPixel(x,y,RGB(0,255,0));
}
练习,画出下面图形。
这里呢,先把上一讲的联系讲一下。
一般人都用是一个一个的去画,但是那样好麻烦,计算机的有点就是容易处理重复的事情,那就定义成一个画正方形函数吧,每次调用就可以了。
怎么自定义函数呢?
我们先在上次我们建的项目CDemoView那儿右击,选择Add Menber Function 然后我们添加函数返回值及函数描述就可以了。
如图:
点击确定,我们就到了函数定义地方,编写函数就可以了
编写完我么那就可以在OnDraw 里面调用了。
然后一相同的方法继续编写画圆的方法就可以了
void CDemoView::DrawCircle(int x, int y, int r,int color)
{
CDC *pDC = GetDC();//获取设备环境
for(double sita=0;sita<314.0;sita+=1.0/50)
{
int xx =x+r*cos(sita);
int yy =y+r*sin(sita);
之前我们已经可以画出直线和曲线了。但是算法虽容易理解,但是复杂度高,今天就介绍比较流行的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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
网上好多人画图解释说明,这里我就不说了。
下面就是处理鼠标事件
鼠标事件
我们先添加四个成员变量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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
按照上面的方法步骤,继续添加鼠标左键松开的响应事件。
同时即可画出线段。
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));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
效果如下:
下面,我们以所画的线段为对角线,画一个矩形。
这个也很简单,自己画个图,就可以写出代码
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));
- 1
- 2
- 3
- 4
效果如下
打完收工。。。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)