[VC++课程设计] 用mfc实现数学函数曲线绘制程序

本文介绍了一个使用VC++和MFC实现的数学函数曲线绘制程序,支持多种函数类型和操作,如普通函数、极坐标函数、参数方程、数据点绘制。用户可以编辑函数、删除图像、拖动图像、放大缩小、查看坐标等。程序包含CalculatorFunc、FuncData等源文件,详细介绍了每个文件的功能和设计思路。同时,文章提供了完整代码的GitHub、Gitee和CSDN下载链接,以及相关参考资料。
摘要由CSDN通过智能技术生成

实验环境

  • 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
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值