/MiniGrapher

An application that plots function graphs.

Primary LanguageC++

MiniGrapher

项目介绍

项目概况

  • 本项目使用 C++ 以及 Qt5 开发,采用MVVM框架实现。
  • 本项目支持跨平台编译(Windows, macOS, Linux),在已经下载安装Qt并配置好环境变量后可以直接编译。
  • Windows版本可以在Release页面下载。
  • 本项目使用Appveyor平台进行持续集成。

功能实现

基本功能

  • 给定函数解析式的词法解析
  • 给定函数解析式的图像绘制
  • 给定区间的函数定积分计算
  • 给定横坐标的函数微分计算
  • 函数图像的缩放
  • 坐标轴的平移

附加功能

  • 多个函数的同时显示
  • x轴单向缩放
  • y轴单向缩放
  • 函数解析式输入正确与否的交互提示
  • 增加随机函数曲线
  • 选中单个函数曲线
  • 删除指定函数曲线
  • 删除所有函数曲线
  • 绘制结果图名称更改
  • 坐标轴名称更改
  • 函数曲线注记名称更改
  • 函数曲线注记位置更改
  • 选中函数曲线画笔颜色自定义更改
  • 选中函数曲线阴影颜色自定义更改
  • 选中函数曲线类型自定义更改

支持函数

  • 多项式函数,如x^3+2*x^2+5*x+1
  • 三角函数
    • sin(x)
    • cos(x)
    • tan(x)
  • 对数函数
    • lg(x)
    • ln(x)
  • 数学函数
    • abs(x)
    • sqrt(x)
  • 上述所有函数的复合形式,如sin(x^2+1)*ln(x^3*cos(2*x))/(x^2+1)

单元测试

测试原理

  • 测试利用了Qt的 QTest 库,将ViewModelModelAlgorithm层的数据整合进行测试
  • 测试代码**有11个测试函数,测试函数覆盖:
    • 一次函数
    • 二次函数
    • 三次函数
    • 正弦函数
    • 余弦函数
    • 正切函数
    • 常用对数函数
    • 自然对数函数
    • 绝对值函数
    • 开方函数
    • 复合函数
  • 在每一个测试函数中,分以下三步进行测试:
    • 测试x,y的关系在误差范围内是否满足函数关系式
    • 测试函数定积分计算是否在误差范围之内
    • 测试函数微分计算是否在误差范围之内
  • 误差范围设置为1e-3

测试结果

  • 测试截图如下:

Test_Result

  • 详细测试信息可以在Appveyor页面查看,由于项目前期建立的是私有仓库,所以这个页面只包含最近几次的含测试信息的内容。

最终运行效果图

软件主界面

MainWindow

函数绘图

sine

linear

PlotGraph

随机生成图像、选中、删除功能

random_selection_deletion

图像缩放、坐标轴平移缩放、名称更改、画笔/笔刷颜色更改等功能

interactions

绘图成功/失败提示、单击点纵坐标显示(左下角)

info

项目目录

.
├── Algorithm
│   ├── lexer.cpp
│   ├── lexer.h
│   ├── prefixtree.cpp
│   └── prefixtree.h
├── App
│   ├── app.cpp
│   ├── app.h
│   ├── commands
│   │   ├── startcommand.cpp
│   │   └── startcommand.h
│   └── main.cpp
├── Common
│   └── etlbase.h
├── Doc
│   ├── DocImages
│   │   ├── Veiw001.png
│   │   ├── View002.png
│   │   ├── View003.png
│   │   ├── View004.png
│   │   ├── View005.png
│   │   ├── View006.png
│   │   ├── View007.png
│   │   ├── View008.png
│   │   ├── View009.png
│   │   └── View010.png
│   ├── MiniGrapher总体报告.md
│   ├── MiniGrapher需求分析.md
│   └── 个人报告-吴宁超.md
│   └── 个人报告-余亚鑫.md
│   └── 个人报告-萧芷晴.md
├── Images
│   ├── MainWindow.png
│   ├── PlotGraph.gif
│   ├── Test_Result.png
│   ├── info.gif
│   ├── interactions.gif
│   ├── linear.png
│   ├── random_selection_deletion.gif
│   └── sine.png
├── Lib
│   ├── qcustomplot.cpp
│   └── qcustomplot.h
├── MiniGrapher.pro
├── Model
│   ├── model.cpp
│   └── model.h
├── README.md
├── Src
│   └── libstdc++-6.dll
├── Test
│   ├── MiniGrapher_Test.cpp
│   └── MiniGrapher_Test.pro
├── View
│   ├── brushtool.cpp
│   ├── brushtool.h
│   ├── initial.cpp
│   ├── initial.h
│   ├── initial.ui
│   ├── mainwindow.cpp
│   ├── mainwindow.h
│   ├── mainwindow.ui
│   ├── pentool.cpp
│   ├── pentool.h
│   └── sinks
│       ├── mainwindowprosink.cpp
│       ├── mainwindowprosink.h
│       ├── mainwindowsetsink.cpp
│       └── mainwindowsetsink.h
├── ViewModel
│   ├── commands
│   │   ├── PaintCommand.cpp
│   │   ├── PaintCommand.h
│   │   ├── calculuscommand.cpp
│   │   └── calculuscommand.h
│   ├── sinks
│   │   ├── viewmodelsink.cpp
│   │   └── viewmodelsink.h
│   ├── viewmodel.cpp
│   └── viewmodel.h
└── appveyor.yml

16 directories, 65 files

小组成员

  • 组长
    • 吴宁超
      • 进行分工协调,MVVM框架的搭建以及Appveyor持续集成环境的搭建
      • 负责View层中给定横纵坐标数据的函数图像的绘制和显示、微分积分结果的显示
      • 负责App层的组装,以生成可以发布执行的应用程序
  • 组员
    • 余亚鑫
      • Model层以及Algorithm层词法解析算法的实现
      • Model层中给定横坐标的微分、给定区间的积分等底层数据计算的实现
      • ViewModel层相关命令与接口实现
    • 萧芷晴
      • 应用程序UI设计、美化与实现
      • View层函数图像操作以及缩放、拖动、更名等交互功能的实现
      • View层自定义画笔颜色、笔刷颜色的实现