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 ...
随机推荐
- idea在debug模式启动非常慢,日志正常debug模式一直在启动中状态
背景 最近在使用idea开发工具时遇到了一个奇怪的现象,使用run tomcat项目可以正常启动,但是使用debug模式启动时,控制台可以正常打印日志,但是进度十分缓慢,也没有任何报出任何错误信息.只 ...
- django设置数据库事务,通过异常处理回滚事务
1.setting.py配置文件,开启事务ATOMIC_REQUESTS DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql' ...
- 希尔排序之C++实现(初级版)
希尔排序之C++实现(初级版) 一.源代码:希尔排序之C++实现(初级版) /*希尔排序基本思想: 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组. 所有距离为d1的倍数的记录放在同一个 ...
- 【HDU 3662】3D Convex Hull
http://acm.hdu.edu.cn/showproblem.php?pid=3662 求给定空间中的点的三维凸包上有多少个面. 用增量法,不断加入点,把新加的点能看到的面都删掉,不能看到的面与 ...
- bzoj 3672 利用点分治将CDQ分治推广到树型结构上
最大的收获就是题目所说. deal(s) : 处理节点s所在块的问题,并保证: 1.s是该块中最靠近根节点的点,没有之一. 2.s所在块到根节点的路径上的点全都用来更新过了s所在块的所有节点. 然后步 ...
- Codeforces Round #356 (Div. 2) B. Bear and Finding Criminal 水题
B. Bear and Finding Criminals 题目连接: http://www.codeforces.com/contest/680/problem/B Description Ther ...
- 理解PHP数组的序列化和反序列化
当我们想要将数组值存储到数据库时,就可以对数组进行序列化操作,然后将序列化后的值存储到数据库中.其实PHP序列化数组就是将复杂的数组数据类型转换为字符串,方便数组存库操作.对PHP数组进行序列化和反序 ...
- 华为S5300系列交换机V100R005SPH020升级补丁
S23_33_53-V100R005SPH020.pat 附件: 链接:https://pan.baidu.com/s/1-qgNEtRsZbNnC4eK4DTctA 密码:wpn3
- MVC中使用AngularJS-01,基本
Angularjs是一个前端的Javascript MVC 库和框架,使前端得到更好的设计.维护和测试.它的核心特性有:MVC.双向数据绑定.指令和语义化标签.模块化工具.依赖注入.HTML模板,以及 ...
- linux 查找文件命令
find -name 文件名 在当前目录下查找 find -name nginx.conf