在科学计算中经常需要将采样数据用曲线作出来。如果将作图这部分
工作用通用代码完成,
可以解决很大的编程负担。为此,在下写了这个类,供大家使用。如果有好的建议,请不
吝指教。
为了简洁,没有加入异常处理代码。
功能:输入数据x[0~N-1],给出作图参数,绘出曲线。
i.e.
CDC* pdc=GetDC();
table tbl;
tbl.SetDC(pdc);
tbl.SetRect(CRect(100,100,700,500));//作图范围
tbl.SetXRange(-0.5,0.5);//第一个数据的x坐标是-0.5,最后一个数据的坐标是0.5
tbl.SetXNote("fs");
tbl.SetYNote("db");
tbl.SetDat(x,N-1);//传入数据
tbl.SetTitle("your title");//设置标题
tbl.prepare();//计算参数
tbl.draw();//作图
下面是代码:
//table.h
class table
{
private:
CDC* m_pdc;
CRect m_rect;//作图范围
CRect m_margin;//边距。防止标注跑出作图范围,要留有裕量
double* m_dat;//数据
int m_N;//数据长度
//作图参数
CPoint m_o;//坐标原点
double m_oxvalue;//原点处x轴值
double m_oyvalue;//原点处y轴值
double m_ymax;
double m_ymin;
double m_xmax;
double m_xmin;//y,x的最大值和最小值
double m_yunit;
double m_xunit;//y,x的刻度单位
int m_yp;
int m_yn;
int m_xp;
int m_xn;//y,x在正、负半轴的格数
int m_ylen;
int m_xlen;//y,x每格长度(像素)
CString m_title;//图表名称
CString m_ynote;//y轴标记
CString m_xnote;//x轴标记
public:
void prepare();
table(CDC* pdc,CRect rect,double* dat,int N,double t1,double t2);
table();
~table();
/*设置标题,坐标说明*/
void SetTitle(CString title);
void SetXNote(CString xnote);
void SetYNote(CString ynote);
void SetDC(CDC* pdc){m_pdc=pdc;}
void SetRect(CRect rc){m_rect=rc;}
void SetDat(double* dat,int N){m_dat=dat;m_N=N;}
void SetXRange(double t1,double t2){m_xmin=t1;m_xmax=t2;}
void draw();
};
//table.cpp
#include "stdafx.h"
#include
#include "table.h"
table::table(CDC* pdc,CRect rect,double* dat,int N,double t1,double t2)
{
m_pdc=pdc;
m_rect=rect;
m_N=N;
m_dat=dat;
m_xmax=t2;
m_xmin=t1;
m_margin=CRect(20,20,10,20);
m_xnote="x";
m_ynote="y";
m_title="未命名曲线";
}
table::table()
{
m_pdc=0;
m_dat=0;
m_N=0;
m_margin=CRect(20,20,10,20);
m_xnote="x";
m_ynote="y";
m_title="未命名曲线";
}
table::~table()
{
}
void table::draw()
{
if(!m_pdc || !m_dat || (m_N==0)) return;
int i;
CString str;
CDC memdc;
memdc.CreateCompatibleDC(m_pdc);
CBitmap bmp,*pOldBmp;
bmp.CreateCompatibleBitmap(m_pdc,m_rect.Width(),m_rect.Height());
pOldBmp=memdc.SelectObject(&;bmp);
CRect bmprect(0,0,m_rect.Width(),m_rect.Height());
CPoint bmpo(m_o.x-m_rect.left,m_o.y-m_rect.top);
memdc.Rectangle(bmprect);
//标题
memdc.SetTextColor(RGB(200,150,100));
memdc.SetTextAlign(TA_CENTER|TA_TOP);
memdc.TextOut((bmprect.l
eft+bmprect.right)/2,bmprect.top,m_title);
//坐标轴
memdc.SetTextColor(RGB(150,150,0));
memdc.SetTextAlign(TA_RIGHT|TA_BOTTOM);
double t=m_xunit;
int e=0;
while(t<=1.0){
t*=10.0;
e--;
}
while(t>=10.0){
t/=10.0;
e++;
}
str.Format("%.0fe%d",t,e);
str+=m_xnote;
memdc.TextOut(bmprect.right,bmpo.y,str);
memdc.SetTextColor(RGB(0,0,0));
memdc.SetTextAlign(TA_LEFT|TA_TOP);
for(i=-m_xn;i<=m_xp;i++){
str.Format("%d",i);
memdc.TextOut(bmpo.x+m_xlen*i,bmpo.y,str);
memdc.MoveTo(bmpo.x+m_xlen*i,bmpo.y);
memdc.LineTo(bmpo.x