這是之前做的一個在直角座標系中畫數學函數得小程序。
首先我的講一下畫筆的畫圖規則:
例:
我們開始建立一個畫布時他的座標原點在左上角,爲了方便我我們正常的畫圖
我們的重新設置座標原點
代碼如下:
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