自己是电子信息方向的,因此总是需要处理大量的电路实验、电路数据和电路仿真处理,每次处理数据时候还需要同样的数据很多遍, 又需要关于电路的频率响应和时域响应情况,所以一直有做一个这样公式编辑器的打算了。 本来想使用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制作公式编辑器,函数编辑器和图形绘制的更多相关文章

  1. 使用原生JavaScript的Canvas实现拖拽式图形绘制,支持画笔、线条、箭头、三角形、矩形、平行四边形、梯形以及多边形和圆形,不依赖任何库和插件,有演示demo

    前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包 ...

  2. [前端随笔][JavaScript] 制作一个富文本编辑器

    写在前面 现在网上有很多现成的富文本编辑器,比如百度家的UEditor,kindeditor,niceditor等等,功能特别的多,API也很多,要去熟悉他的规则也很麻烦,所以想自己了解一下原理,做一 ...

  3. 推荐12个最好的 JavaScript 图形绘制库

    众多周知,图形和图表要比文本更具表现力和说服力.图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等.可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web  ...

  4. 如何用iframe标签以及Javascript制作时钟?

    如何利用iframe标签以及Javascript制作时钟? 如何制作一个时钟呢?效果如下图所示: 这里的时钟会不停的走,但是下面的页面是不会变得,这样就实现了我们想要的效果了.下面我将分为以下几个方面 ...

  5. jQuery插件-jgcharts实现Javascript制作Google Charts

    from:http://www.zz68.net/program/Ajax/2010/0415/1992.html jgcharts是一个基于jQuery的非常经典的Google Charts图表制作 ...

  6. Excel公式与函数——每天学一个

    说明(2018-5-29 20:35:53): 1. 根据刘伟的视频讲解进行总结,网上讲Excel公式与函数的貌似就他讲的还不错.在他的微博里看到现在的照片胖了不少,不过还挺帅的,不再是以前那个小屌丝 ...

  7. 使用JavaScript制作一个好看的轮播图

    目录 使用JavaScript制作出好看的轮播图效果 准备材料 1.图片若干张(包括轮播图和按钮的图片) 2.将按钮的图片应用到按钮上的CSS样式文件 3.实现轮播和点击跳转的JavaScript代码 ...

  8. Javascript自执行匿名函数(function() { })()的原理分析

    匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function() { alert('hell ...

  9. 借助JavaScript中的时间函数改变Html中Table边框的颜色

    借助JavaScript中的时间函数改变Html中Table边框的颜色 <html> <head> <meta http-equiv="Content-Type ...

随机推荐

  1. mongodb中获取图片文件<标记>

    获取图片文件 @RequestMapping(value="/downLoadFileFormMongo.do",method=RequestMethod.GET) @Respon ...

  2. Urllib库的基本用法

    1.什么是url? 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址. 基本URL包含模式(或称协议).服务器名称(或IP地址).路径和文件名,如“ ...

  3. C# String.Format 格式化字符串 数字/时间

    首先献给只想知道结果的人 格式化 DateTime 对象 标准 数字 格式化 Int Decimal Float Double 关于这一块一直不是很清楚,MSDN 上也不够清晰. 就花了点时间敲了一下 ...

  4. css平移动画的实现

    参考这位大佬的帖子:https://www.jianshu.com/p/5d8e77ef7f84

  5. bzoj3173 Splay 维护前缀中的最大值

    大致题意: 有一个空序列,依次插入1~N到该序列中,每次指定插入的位置,每次插入完成返回当前序列的LIS的长度. 题解: 设dp[i]表示 前缀1~i的最长上升子序列的长度. 因为是按照递增顺序插入的 ...

  6. 【对比分析三】CSS中 link 和@import 的区别

    1).  link 是 XHTML 标签,无兼容问题: @import 是在 CSS2.1 提出的,只有IE5以上才能识别. 2).  语法结构不同. link (链接式)只能放入HTML源码中,语法 ...

  7. Codeforces Round #356 (Div. 2) A. Bear and Five Cards 水题

    A. Bear and Five Cards 题目连接: http://www.codeforces.com/contest/680/problem/A Description A little be ...

  8. CD0J/POJ 851/3126 方老师与素数/Prime Path BFS

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9982   Accepted: 5724 Descri ...

  9. Windows Performance Toolkit

    http://bigasp.com/archives/606 https://randomascii.wordpress.com/category/xperf/ ADK 8.0  (C:\Progra ...

  10. IIS服务中五种身份验证

    转载:http://os.51cto.com/art/201005/202380.htm 作为微软最经典的Web服务之一的IIS服务有大致上五种Web身份认证方法.身份认证时保障IIS服务安全的根本, ...