javascript制作公式编辑器,函数编辑器和图形绘制
自己是电子信息方向的,因此总是需要处理大量的电路实验、电路数据和电路仿真处理,每次处理数据时候还需要同样的数据很多遍, 又需要关于电路的频率响应和时域响应情况,所以一直有做一个这样公式编辑器的打算了。 本来想使用VC的,但是想到javascript的eval()函数,就可以省去数据计算的算法了,而且对于用户函数扩展都有帮助。
仔细想想后,作品需要有公式编辑、自定义操作符、自定义函数、系统函数调用、变量更新处理、定时器实现遍历变量处理、图形绘制和保存公式和函数等模块。

这就是最终的界面了前面讲的功能基本都实现了。
我觉的IT领域代码纯粹是属于技术了,只要花时间总是能够做好的,只是这种架构的模式和创意很重要。 而这种感性认识很大一部分来自于视野,看的东西、经历的东西、悟的东西多了,灵感也会多点。 因此,还是希望我们程序员们不要总是宅在电脑前了。
一:公式编辑
好了,言归正传。 js里面有个eval()函数,可以动态执行代码。因此可以让用户操作脚本的运行。 在这个编辑器中也就是这样,将用户编辑的公式,经过变量处理、运算符号判断等处理,转换成eval()可以运行的语句。关于将用户输入的语句转换成可执行语句是比较困难、麻烦的,因为需要大量的判断,例如是否碰到运算符,数字,变量是否重复,变量命名规制等等。 由于比较复杂,我贴下自己的供参考:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<span style="font-size:18px;">var dealSentence = function (str, num) //num对应与order { var pos, end, i = 0, temp = ""; order[num] = ""; while (i < str.length)//遍历一次 { if (judgeChar(str.charAt(i)) == 0) //如果当前的字符不是数字和字母,就应该是运算符 { //可以通过其他办法动态添加运算符 order[num] += str.charAt(i); i++; } else //说明是一个变量,需要创建变量 { pos = i; end = 0; //记录这个变量的首尾位置 while (judgeChar(str.charAt(i)) >0) //直到检验出符号或者退出 { i++; if (i >= str.length) break; } end = i; temp = str.substring(pos, end); //获取对应的子字串 var x = judgeMathFunction(temp); //判断是否是数学符号 if (judgeStringNum(temp) == false) //表示字符串不全是数字,有可能是变量,也有可能是数学函数 { if (x < 0) //如果不是数学函数 { var x = new PARAM(); x.name = temp; x.num = paramcount; x.value = 0; //初始化 pos = judgeParamExist(x.name); if (pos < 0) //表示没有与之前的变量重合 { param[paramcount] = x; order[num] += x.value; paramcount++; //创建变量并且保存 } else order[num] += param[pos].value; } else if (x < 100) //表示是自带的数学函数 order[num] += "Math." + temp; //转换成对应的数学运算 else //>=100表示对应的是自定义的函数 order[num] += temp; //先不进行处理 } else //如果字符串只是数字,不创建变量 order[num] += temp; } } }</span> |
其中包含了许多的函数和变量、对象,大家可能不懂,也没关系,知道在判断时候小心严谨点就好了。
二:变量处理
大家想,一旦用户输入了公式,就希望轻松改一下参数就可以瞬间算出全部结果了,所以可以把变量和结果制作成表格,允许用户修改变量值并且更新结果。
对于高级功能。 大家有没有遇到过一个运算过程中需要将某个变量或几个变量递增或递减呢? 应该会的,我求解电路方程时经常需要变化。
技术活可以用setInterval()实现的,给个大概:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<span style="font-size:18px;"> /*******开始运行高级功能****************/ var time = null; var start = function () // { readValue(); //获取值 dealFlag(); //处理标签 if (begin == true) //表示开始定时器 time = setInterval("settime()", 300); //没300ms处理一次 else clearInterval(time); } /******定时器************/ var settime = function () // { for (var i = 0; i < paramcount; i++)// 先更新值 { if (method[i] == "y" || method[i] == "Y") param[i].value += parseFloat(small[i]); if (method[i] == "n" || method == "N") param[i].value -= parseFloat(small[i]); } updateAdancedTable(); } /**************************处理begin***************/ var dealFlag = function ()// { if (begin == false)// { begin = true; document.getElementById("BS").innerHTML = "暂停"; } else // { begin = false; document.getElementById("BS").innerHTML = "开始"; } }</span> |
同样不是不完整的,需要其他函数的支持。
三:自定义函数或者符号
有些时候,用户需要经常使用某些算式,那么就可以让他们自己定义成函数或者操作符了,例如我们经常使用电路中并联运算,所以可以定义并联符号//,多方便。
这个其实还是基于eval()的,例如 str="function And(){"+ order+"} And()";
其中order是用户编辑的,可以修改一下。 先定义函数,在执行这个函数,eval(str)后就完成了。具体的大家可以再好好想想
四:图形绘制
图形是表达式最直观的表现形式了,例如找最值,拐点,趋势等。
图形一般就要求自变量和因变量了,在固定自变量输入范围后利用插值法就可以绘制图形了。
绘制图形这里需要用到HTML5中<canvas>对象,而且还需要新的浏览器的支持,这个功能与保存功能是矛盾的,因为只有IE得到用户许可后才能保存文件,但是连IE8都不支持html5,杯具了……
东西都是做的出来的,只是想法不一样罢了。而且这个编辑器也还是有些bug的,只要大家有创意,都能够完成,欢迎大家指正与讨论。
javascript制作公式编辑器,函数编辑器和图形绘制的更多相关文章
- 使用原生JavaScript的Canvas实现拖拽式图形绘制,支持画笔、线条、箭头、三角形、矩形、平行四边形、梯形以及多边形和圆形,不依赖任何库和插件,有演示demo
前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包 ...
- [前端随笔][JavaScript] 制作一个富文本编辑器
写在前面 现在网上有很多现成的富文本编辑器,比如百度家的UEditor,kindeditor,niceditor等等,功能特别的多,API也很多,要去熟悉他的规则也很麻烦,所以想自己了解一下原理,做一 ...
- 推荐12个最好的 JavaScript 图形绘制库
众多周知,图形和图表要比文本更具表现力和说服力.图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等.可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web ...
- 如何用iframe标签以及Javascript制作时钟?
如何利用iframe标签以及Javascript制作时钟? 如何制作一个时钟呢?效果如下图所示: 这里的时钟会不停的走,但是下面的页面是不会变得,这样就实现了我们想要的效果了.下面我将分为以下几个方面 ...
- jQuery插件-jgcharts实现Javascript制作Google Charts
from:http://www.zz68.net/program/Ajax/2010/0415/1992.html jgcharts是一个基于jQuery的非常经典的Google Charts图表制作 ...
- Excel公式与函数——每天学一个
说明(2018-5-29 20:35:53): 1. 根据刘伟的视频讲解进行总结,网上讲Excel公式与函数的貌似就他讲的还不错.在他的微博里看到现在的照片胖了不少,不过还挺帅的,不再是以前那个小屌丝 ...
- 使用JavaScript制作一个好看的轮播图
目录 使用JavaScript制作出好看的轮播图效果 准备材料 1.图片若干张(包括轮播图和按钮的图片) 2.将按钮的图片应用到按钮上的CSS样式文件 3.实现轮播和点击跳转的JavaScript代码 ...
- Javascript自执行匿名函数(function() { })()的原理分析
匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function() { alert('hell ...
- 借助JavaScript中的时间函数改变Html中Table边框的颜色
借助JavaScript中的时间函数改变Html中Table边框的颜色 <html> <head> <meta http-equiv="Content-Type ...
随机推荐
- 机器学习之路:python 字典特征提取器 DictVectorizer
python3 学习使用api 将字典类型数据结构的样本,抽取特征,转化成向量形式 源码git: https://github.com/linyi0604/MachineLearning 代码: fr ...
- DataGridView、List<T>相关操作
一.DataGridView数据转成DataTable 1.已绑定过数据源:DataTable dt = (dataGridView1.DataSource as DataTable) 2.未绑定过数 ...
- .net正则提取手机号码,并替换带有手机号码的a标签
//用正则查找字符串中的手机号码,最后替换成带a标签的可打电话的字符串 var str = "收件人:江苏省苏州市工业园区屌丝大叔收,电话:18688888888"; var re ...
- AbstractAction
package cn.tz.action.abs; import java.io.File; import java.io.IOException; import java.text.SimpleDa ...
- mysql slock
http://www.itdks.com/dakashuo/new/dakalive/detail/3888
- redhat server 5.3内核升极2.6.18 升级到 3.5 装systemtap 原创
1. 在 LINUX 3.5源代码目录下执行 yum install ncurses-devel make menuconfig 2 打开内核跟踪事件,用于SYSTEMTAP跟踪 kern ...
- 11gR2 RAC重新启动后仅仅能起单节点
11gR2 RAC重新启动后仅仅能起单节点 问题背景: 将11gR2 RAC正常部署完毕之后运行两节点重新启动操作发现当中有一个节点的集群资源无法启动,遂再次重新启动该无法启动集群资源的节点,还是不可 ...
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver解决方式
昨天整理桌面的时候将桌面的一堆文件移动到F盘去了,结果导致原来建的一些项目名称所有出现红色感叹号,打开一看,原来是由于我把hibernate的那些jar包移走了.导致user library里那些ja ...
- extjs 动态设定 DateField 最大值 最小值
yxrqDate.minValue = new Date();yxrqDate.maxValue = new Date(9000,1,1);yxrqDate.validate(); //var pic ...
- Selenium2+python自动化55-unittest之装饰器(@classmethod)
前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...