这是之前做的一个在直角坐标系中画数学函数得小程序。
首先我的讲一下画笔的画图规则:
例:
我们开始建立一个画布时他的坐标原点在左上角,为了方便我我们正常的画图
我们的重新设置坐标原点
代码如下:
pDC-> SetViewportOrg(point/2,point/2);//设置中心坐标
MoveTo(x,y);//起点
LineTo(x,y);//连线的点
TextOut(x,y,a);//a为所显示的内容
而这个程序的主要思想其实就是不断得在界面上画图。图中得网格,刻度
都是用画笔画的:
网格:
CPen *pPenblue = new CPen(); //创建画笔对象
pPenblue ->CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); //蓝色画笔
pDC ->SelectObject(pPenblue);
for(int z=0;z<=point/10;z++)
{
pDC ->MoveTo(-point/2,-point/2+10*z);
pDC ->LineTo(point/2,-point/2+10*z);
pDC ->MoveTo(-point/2+10*z,-point/2);
pDC ->LineTo(-point/2+10*z,point/2);
}
point的其实就是控制画布大小的,用来放大和缩小,刻度的位置确定等,贯穿整个程序。
画函数图像:
先确定起点第一个起点,再连接到第一个终点,在确定第二个起点,连接到第二个终点,其实第二个的起点就是第一个的终点,依次类推,for()其实就是用来确定范围的
代码如下:
//确定画笔起点
for(x=-point/2*100;x<=point/2*100;x++)
{
m=x*0.01;
y=(atof(a)*pow(m,4)+atof(b)*pow(m,3)+atof(c)*pow(m,2)+atof(d)*m+atof(e))*(point/20);//表达式
y=y+(u-1)*(point/20)-f*(point/20);
m=m*(point/20)+(point/20)*(r-1)-(point/20)*(l-1);
if(y<point/2&&y>-point/2&&m>-(point/2)&&m<(point/2))//规定画图范围
{
pDC ->MoveTo(m,y);
break;
}
}
for(int x=-point/2*100;x<=point/2*100;x++)//确定连线的点
{
m=x*0.01;
y=(atof(a)*pow(m,4)+atof(b)*pow(m,3)+atof(c)*pow(m,2)+atof(d)*m+atof(e))*(point/20);//表达式
y=y+(u-1)*(point/20)-f*(point/20);
m=m*(point/20)+(point/20)*(r-1)-(point/20)*(l-1);
if(y<point/2&&y>-point/2&&m>-(point/2)&&m<(point/2))//规定画图范围
{
pDC ->LineTo(m,y); //竖起轴
}
}
改程序中还实现了上下左右放大和缩小的功能:
放大缩小:
就像我刚刚所说的一样,通过调节point值得大小,来放大和缩小所画图像得大小。
上下左右:
通过定义几个变量,放比例调节几个变量得大小
u=1,f=1,l=1,r=1;
U是用来向上移动用的
f是向下移动用的
l向左移动用的
r是向右移动用的
例向下移动:
向下和向左得数值是负的,所以f,l的值要减去。
没次按下向下的键,所以f++;f的值就增大。
代码如下:
for(x=-point/2*100;x<=point/2*100;x++)
{
m=x*0.01;
y=(atof(a)*pow(m,4)+atof(b)*pow(m,3)+atof(c)*pow(m,2)+atof(d)*m+atof(e))*(point/20);//表达式
y=y+(u-1)*(point/20)-f*(point/20);
m=m*(point/20)+(point/20)*(r-1)-(point/20)*(l-1);
if(y<point/2&&y>-point/2&&m>-(point/2)&&m<(point/2))//规定画图范围
{
pDC ->MoveTo(m,y);
break;
}
}
for(int x=-point/2*100;x<=point/2*100;x++)//确定连线的点
{
m=x*0.01;
y=(atof(a)*pow(m,4)+atof(b)*pow(m,3)+atof(c)*pow(m,2)+atof(d)*m+atof(e))*(point/20);//表达式
y=y+(u-1)*(point/20)-f*(point/20);
m=m*(point/20)+(point/20)*(r-1)-(point/20)*(l-1);
if(y<point/2&&y>-point/2&&m>-(point/2)&&m<(point/2))//规定画图范围
{
pDC ->LineTo(m,y); //竖起轴
}
}
f++;
希望对大家有帮助!!!
源代码下载:https://download.csdn.net/download/qq_38977566/10794602