ReliefMath++

ReliefMath++ 是原生 FLTK 几何与函数绘图应用。程序命令为 reliefmathpp,在 Office 分组中提供 desktop 入口,支持直接打开 .rmathpp 文档。它与编辑和排版 LaTeX 的 ReliefMath 独立。

使用

  1. 在“二维绘图”或“三维绘图”中选择对象工具。

  2. 在左侧填写公式、坐标和范围,按“应用属性”或 Ctrl+Enter。

  3. 在右侧切换二维、三维视图;拖动平移或旋转,滚轮缩放,Home 重置。“适合”按可见对象设置视图。

  4. 参数 a、b、c、d 可用滑块调整,也可在右侧输入框中输入数值并按 Enter。

  5. 在“计算与工具”中使用函数计算、三维函数计算、值表、几何度量、向量和拾点构造。

提供正弦/余弦/圆、波纹曲面/螺旋线、环面/向量、玫瑰线/椭圆四组示例。新对象使用可直接绘制的默认数据。属性栏按当前类型收起无关公式和坐标控件;第二个采样范围只用于二变量对象。短窗口中可滚动查看。

对象

  • 类别:二维函数; 支持内容:y=f(x)、隐式 F(x,y)=0、极坐标 r(t)、参数曲线 x(t),y(t); 公式变量:x/y 或 t

  • 类别:二维几何; 支持内容:点、线段、向量、圆、椭圆、三角形、矩形; 公式变量:数值坐标和尺寸

  • 类别:三维函数; 支持内容:z=f(x,y)、参数曲面 x(u,v),y(u,v),z(u,v)、空间参数曲线 x(t),y(t),z(t); 公式变量:x/y、u/v 或 t

  • 类别:三维几何; 支持内容:点、线段、向量、三角形、任意朝向平面、球、长方体、沿 Z 轴的圆柱和圆锥; 公式变量:数值坐标和尺寸

所有公式还可以使用 a/b/c/d。坐标框使用英文逗号分隔,例如 0,0,3。平面输入法向量与常数,遵循 nx*x+ny*y+nz*z=d。三维使用正交软件投影,无 GPU 或联网依赖;支持面片着色和完整线框。

表达式

  • 常量:pi、tau、e,角度统一为弧度。

  • 运算:+ - * / % ^、< <= > >= == !=、&& ||;^ 右结合,-2^2=-4,2^3^2=512。

  • 一元函数:sin cos tan asin acos atan sinh cosh tanh exp ln log log10 log2 sqrt abs floor ceil round sign。

  • 多元函数:min(a,b)、max(a,b)、pow(a,b)、atan2(y,x)、hypot(a,b)、if(条件,真值,假值)。

  • 乘法必须写 *,如 2*x、a*sin(x);不接受 LaTeX、脚本、文件访问或外部命令。

  • 未定义和非有限值不参与曲线连线;曲线、曲面和隐式绘制均采用有限采样,间断检测为数值启发式。

计算和导出

二维显函数支持函数值、一二阶导数、定积分、端点夹根、两函数交点、区间极值搜索、弧长和切线。三维显函数支持函数值、梯度/法向量、拉普拉斯算子、切平面、矩形区域二重积分和曲面面积。切线与切平面保存计算当时的数值参数。

几何度量提供长度/周长、面积/表面积和体积;椭圆周长使用近似公式。向量工具提供点积、叉积、长度、夹角、两点距离、中点和平行四边形面积。

支持当前视图 SVG 和 PNG;二维值表支持 CSV,最多 2000 行,未定义值标为 undefined。SVG 保留文字和矢量图元;PNG 从独立 FLTK 图像表面获取,与实际绘图使用相同绘制路径。导出不允许覆盖正在编辑的文档或其别名。

存储、响应性和限制

.rmathpp 为 RMPP 魔数、版本 1 的小端格式,记录总长度与 CRC32。保存对象、四个参数、坐标轴/网格/线框、二维中心和范围、三维相机旋转/缩放/中心,以及活动视图。加载先完整校验,失败不替换现有文档。

复用 relieftodo/storage.h 的无异常容器及 relieftodo/file_io.cpp 的事务文件工作进程;共享保存锁负责同目录多个窗口的互斥。保存处理短写、同步、原子替换、符号链接与外部修改冲突。文件操作时禁用文档编辑,避免保存快照与界面状态不一致。

采样在 FLTK 定时器里按曲线段或网格行分批处理;修改会取消旧采样。数值计算运行在可取消的子进程,20 秒仍未返回则终止并报告未取得可靠结果。所有图形控件沿用公共 fltk_support.h 的默认 gtk+ scheme 和中文字体。

  • 每文档最多 64 个对象;名称 128 字节,公式 1024 字节,最多 512 条表达式指令、48 层语法嵌套。

  • 文件和导出数据最多 16 MiB;坐标绝对值不超过 1e8,采样范围不超过 1e6。

  • 网格每轴 16–96,二维曲线每对象最多 1536 段;多对象时限制有效网格精度和总绘图面片。

  • 运算采用双精度浮点。求导和积分不提供符号表达式;误差估计不是严格误差界。

  • 求根要求连续且端点异号,不保证找到偶重根或所有零点;极值使用采样与局部细化,不构成全局最优证明。

  • 二重积分和面积使用 24/48 两级 Simpson 网格;奇点、高频振荡、窄峰及细小结构可能超出采样能力。

  • 三维面片按深度排序;相互穿插曲面的遮挡、线框和近距离视角存在软件投影限制。