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 ...
随机推荐
- djongo form.is_valid 返回false的解决方法
在用djongo编写网站时,有时点击提交按钮之后,并未提交,通过debug会发现是form.is_valid()返回false造成的.但是,具体原因往往并不容易找. 这时在提交的html中添加如下代码 ...
- 在Windows上安装FFmpeg程序
原文地址:http://helloway.blog.51cto.com/7666282/1642247 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录 ...
- springboot配置多数据源mongodb
参考大佬的文章 https://juejin.im/entry/5ab304dd51882555825241b3
- 【字符串哈希】The 16th UESTC Programming Contest Preliminary F - Zero One Problem
题意:给你一个零一矩阵,q次询问,每次给你两个长宽相同的子矩阵,问你它们是恰好有一位不同,还是完全相同,还是有多于一位不同. 对每行分别哈希,先一行一行地尝试匹配,如果恰好发现有一行无法对应,再对那一 ...
- hashmap的遍历方法
How to iterate over the entries of a Map? What is the order of iteration - if you are just using Map ...
- 通过IP获取所在城市
<script type="text/javascript"> var map = new BMap.Map("allmap"); var poin ...
- Google Code Jam 2009 Qualification Round Problem B. Watersheds
https://code.google.com/codejam/contest/90101/dashboard#s=p1 Problem Geologists sometimes divide an ...
- ROW_NUMBER() OVER函数运用
语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) PARTITION BY:相当于数据库中的group by 说明:row_numbe ...
- select 语句的执行顺序
select 语句的执行顺序 借用ItZik Ben-Gan.Lubor Kollar.Dejan Sarka所著的<Sql Server 2005 技术内幕:T-SQL查询>的一段话足以 ...
- JTAG接线描述
http://www.dzsc.com/data/html/2008-12-23/75397.html JTAG测试信号由下面5个信号组成. TRST:测试复位输入信号,测试接口初始化 TCK:测试时 ...