软件功能:输入一个二元数学表达式,含有两个参数变量X和Y,显示该数学表达式的三维图形.
很久之前就有写这个软件的想法,却一直没有激情和动力,终于在年假这两天完成了.以此软件纪念我那十几年前的高中生活,那时我虽然不喜欢数学,但立体几何学得还算不错.不知道还有没有人记得我之前发的博客"数学表达式解析工具"见:http://www.cnblogs.com/WhyEngine/p/3513478.html, 当时写那个小工具就是为这个软件做基础工作.程序写的有点着急,比如我本打算按Z的高度设置不同的颜色,底层接口都已经实现,但发现MFC的界面逻辑写起来有些麻烦,就没写下去.数学表达式的批量解析算法写完之后没有做太多测试,可能存在BUG.还有就是如果算法出现非法运算时,可能会有问题,如log(负数), 除0产生无穷大的数,等以后再做优化吧.
为了该软件,我还写了一个显示立方体包围范围的图形控件,这让我想起很多年前搞VTK时,调用它的接口也能显示出类似的控件.不同的是之前只是调别人的接口,而这次是自己写,写了才发现,这个功能要实现很容易.
数学表达式的规范说明:
(1)标准运算符
支持+,-,*,/,%,^这6种标准运算符,其中:
%为求余运算, a%b 相当于 mod(a, b);
^为求幂运算,
a^b 相当于 pow(a, b);
(2)括号标志符
支持{},
[], ()这三类括号标志符,括号必需成对出现.支持最大32级括号的嵌套.如:
(2+(-2+(5.0*(9
+ ((1+2)*3))/3) + 2))
-{exp[sqrt(abs[sin{rand(100)}])]}
(3)支持函数形式的运算符
运算符的函数名必需为小写字母.具体说明如下:
单目运算操作:
positive(a) // 相当于 +a
negative(a)
// 相当于 -a
abs(a)
floor(a)
ceil(a)
sign(a)
sqrt(a) // a为负时,会得到数值0
exp(a)
// a过大时,会得到数值0
log(a) //
a为负时,会得到数值0
log2(a) //
a为负时,会得到数值0
log10(a) //
a为负时,会得到数值0
sin(a)
cos(a)
tan(a)
asin(a)
acos(a)
atan(a)
rand(a) // 生成一个0到a的随机数
双目运算操作:
add(a,
b)
sub(a, b)
multiply(a,
b)
divide(a, b)
max(a,
b)
min(a, b)
mod(a,
b)
pow(a, b) //
很容易得到无效的数值
atan2(a, b)
rand2(a, b) // 生成一个a到b的随机数
在之前的"数学表达式解析工具"中支持若干个三元和四元的运算函数,但这里不支持,等以后做优化再说.
(4)常量值
有两个常量值
PI
3.1415927
E 2.7182818
常量名必需为大写字母,如(PI + E)或 sin(PI*0.5)
(5)数值解析
对整数的解析支持2,8,10,16四种进制
0X开头为16进制,
XABCDEF大小写都可以, 如0xffff
0Y开头为2进制,
Y大小写都可以, 如0y10101010000
0开头为8进制,
如07523, 注意出现了"08"之类的分失败
默认为10进制
(6)可以设置XY两个参数, XY大小写都可以.
下载地址: