实验环境
- window 10 版本19041
- Microsoft Visual Studio Community 2019 版本 16.6.4
实现功能
- 绘制常见函数的图像
- 支持普通函数,极坐标函数,参数方程,直接输入数据点
- 可以删除指定函数图像
- 可以在一个坐标系中绘制多条数学曲线
- 显示坐标轴,网格,刻度值,图例
- 可以选择不同颜色线型来绘制不同的曲线
- 当鼠标移动到曲线上某点时,可以显示该点的坐标
- 可以用鼠标拖动图像
- 可以进行图形的放大,缩小,定量设置显示范围,自动缩放
- 普通函数x取值范围可设置为跟随显示范围变化
- 状态栏实时显示鼠标位置,双击显示鼠标精确位置
- 重要数据的序列化和反序列化
- 突变函数(如 f l o o r ( x ) floor(x) floor(x))和部分y值接近无穷的函数(如 t a n ( x ) tan(x) tan(x))无法完美显示
界面展示
设计结构
程序流程及设计
用户输入函数信息,显示函数图像。还可以通过菜单和工具栏更改设置。
通过计算样本点,相邻样本点用直线连接,当样本点数量足够大时,可近似看成曲线。
程序所有源文件
CalculatorFunc.cpp介绍
double CalcEquation(CString m_sEquation, bool& succ, char xKey, double xVal)
m_sEquation:表达式
succ:计算是否成功
xKey:未知数是"x"还是"t"
xVal:未知数的值
此文件可以单独拿出来(把CString换成string就行)使用
bool succ = true;
double ans = CalcEquation(“sin(x)+e^x”,succ,‘x’,1.1);
对方程,分为数(常数,未知数x),双目运算符(+ , - ,* , / , ^ ) ,单目运算符(sin,cos等等),单目运算符后面是一个完整的子式,如2+cos(x+1)中,x+1就是一个完整的式子,通过递归调用可以求子式的值,如果已知子式值,这个[单目运算符+子式]就是一个已知数了,那剩下的就等效于只有+ , - , * , / , ^ 的公式,用表达式栈法就可以解决。
FuncData.cpp介绍
FuncData类
成员变量:
int FuncCas; //函数类型
CString m_Equation; //函数表达式
double minX, maxX; //x极值
double maxY, minY; //y极值
int stepX; //可以理解为样本点的数量
int m_penWidth; //画笔宽度
int m_penType; //画笔类型
COLORREF m_color; //画笔颜色
vector<pair<double, double> > vetPoint; //储存所有样本点
成员函数:
virtual double GetY(double xVal, bool& succ) = 0;//得到未知数为xVal时函数值,succ表示计算是否成功
virtual bool CalcList() = 0; //计算vetPoint
virtual bool GetNearest(pair<double,double> NowPoint, pair<double, double> &CmpPoint);//获取本函数与NowPoint最近的点
virtual CString GetEquation2(); //为了得到参数方程第二个函数式
FuncData();
FuncData(CString Equation,double minX,double maxX,int stepX,COLORREF color, int penWidth,int penType);//构造函数
注意:此处派生类只记录特有的成员
NormalFD类
无
PolarFD 类
成员变量
double maxth, minth; //自变量θ取值范围
TwoFD类
成员变量
CString m_EquationY;
double maxT, minT;
成员函数
double GetX(double tVal, bool& succ);//参数方程X也需要求值
virtual double GetY(double tVal, bool& succ);
DataFD类
成员函数
static int DataFD_Cnt; //记录数据点类型函数数量
mfcplotDoc.cpp介绍
mfcplotDoc中记录着设置信息和函数数据,主要内容如下
public:
bool m_WillShowGrid; //是否显示网格
bool m_WillShowAxis; //是否显示坐标轴
bool m_WillShowEdge; //是否显示边框
bool m_SingelMode; //单函数模式添加函数自动删除上一个函数
bool m_ForceXrange; //普通函数x范围是否固定,不固定的话随显示范围变化
bool m_ShowNearPoint;//鼠标接近函数线时是否显示其坐标
double m_Xmin, m_Xmax, m_Ymin, m_Ymax;//显示范围
FuncData *m_FD;//临时变量
CObList m_List;//记录所有函数信息
public:
afx_msg void OnAxisMenu();//坐标轴
afx_msg void OnGridMenu();//网格
afx_msg void OnEdgeMenu();//边框
afx_msg void OnSmallerMenu();//显示范围缩小 0.8
afx_msg void OnBiggerMenu();//显示范围放大 1.25
afx