`
abruzzi
  • 浏览: 456164 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

可编程计算器(phoc)的设计与实现

阅读更多

前言

借助JavaScript脚本引擎Rhino,可以很容易的实现一个计算逻辑与界面相分离,且很容易扩展的可编程计算器。界面部分使用Swing及Netbeans的SAF(Swing Application Framework),计算部分使用Rhino引擎,来实现基本表达式的计算,以及变量,函数的定义等,绘图采用另外一个开源的库jmathtools(http://code.google.com/p/jmathplot/),更多资料请参看这里。这个可编程的计算器暂命名为phoc(Programmable Higi-Order-Calculator),项目我已经托管到google code,感兴趣的朋友可以参看:phoc(http://code.google.com/p/phoc/)。

 

另外,插句题外话,搬家之后的新空间由于种种原因停止租用,现在又回到了JavaEye,人生何处不相逢啊,呵呵。

 

phoc的主要功能

事实上,phoc更多的是为了展示引擎与界面分离,使得更容易扩展计算器本身,而不需要重新的编译计算器,界面除了负责展示计算结果和参入人机交互之外,不会参杂计算逻辑。而脚本,作为phoc的核心,负责所有的计算以及插件的实现而存在。事实上,phoc的绘图功能,就是用JavaScript脚本来实现的。

 

和其他任何的桌面计算器一样的界面:


 

不同的是,用户可以定义自己的函数,界面的作用很简单,将用户定义的函数作为字符串交给引用rhino来eval:

 

 

/**
 *
 * @author juntao
 */
public class Evaluator {
    public Evaluator(){}
    
    public Object evalScriptString(String expr) throws ScriptException{
        RuntimeEnv executor = RuntimeEnv.getInstance();
        Object obj = null;

        obj = executor.getScriptEngine().eval(expr);

        return obj;
    }

    public Object evalScriptFile(File file) throws ScriptException, FileNotFoundException{
        RuntimeEnv executor = RuntimeEnv.getInstance();
        Object obj = null;

        obj = executor.getScriptEngine().eval(new FileReader(file));
        
        return obj;
    }
}

 

 
 函数定义界面:


在输入框中可以直接调用内建的plot2d来完成绘图:


上图即为sin(x)在-PI到PI之间的曲线,此处我们使用的是第三方的开源的jsmathtools来实现,如果想要实现自己的绘图引擎,则在系统内建的脚本plot.js中修改相关代码即可,不需要对已有的phoc中的java代码做修改。

 

设计与实现

为了尽可能的将计算部分独立出来,我们需要尽可能的将涉及计算的部分放入脚本,然后在应用程序初始化的时候,加载并求值这些脚本,初始化完成之后,负责计算的部分就已经存在于系统中。

 

 

    public void initEnv(){
        computer = new Evaluator();
        memory = new Stack();
        symTable = new HashMap<String, Object>();
        try{
            computer.evalScriptFile(new File("script/system.js"));
            computer.evalScriptFile(new File("script/math.js"));
            computer.evalScriptFile(new File("script/plot.js"));
        }catch(Exception e){
            UIKit.alert(e.getMessage(), "Error while initialize calculator");
        }
        
    }

 

内建的脚本可以做一些工具加载(JSON处理,数学运算,画图等),完成之后,在界面部分的输入框中就可以调用这些内建的函数(当然,可以自己定义函数,然后调用)。

 

我们这里看一下plot.js的实现:

 

 

/**
 * i.e.
 * plot2d(function(x){return Math.sin(x);}, {
 *     start : -3.0,
 *     step : 0.1,
 *     stop : 3.0
 * });
 */

function plot2d(func, range){
    var x = DoubleArray.increment(range.start, range.step, range.stop);
    var y = new Array(x.length);

    for(var i = 0, len = x.length; i < len; i++){
        y[i] = func(x[i]);
    }

    var plot = new Plot2DPanel();
    plot.addLegend("SOUTH");

    var name = func.toString();
    plot.addLinePlot(name, Color.GREEN, x, y);

    var frame = new JFrame("plot function : "+name);
    frame.setSize(600, 600);
    frame.setContentPane(plot);
    frame.setVisible(true);
}

plot2d主要是组织参数,然后使用jmathtools来实现绘图(在一个新的frame中)。

 

至于phoc的其他部分,乏善可陈,无非是界面的布局,按钮的事件处理函数等。

 

附后

源码及发布版(v0.2)已经托管之google code,感兴趣的朋友可以自行下载:phoc(http://code.google.com/p/phoc/)

  • 大小: 36 KB
  • 大小: 34 KB
  • 大小: 66.2 KB
分享到:
评论
14 楼 abruzzi 2012-02-10  
lilinpu221 写道
看楼主的贴受益很大,浅显易懂,楼主文笔不错

谢谢,phoc的新版本中已经支持plot3d的功能,当然,还是依赖于这个优秀的jmathtools。JavaScript-内核系列的第十四章中讨论了JavaScript在Java中的应用,你可以参考下。
http://www.icodeit.org/%E7%AC%AC%E5%8D%81%E5%9B%9B%E7%AB%A0-java%E5%BA%94%E7%94%A8%E4%B8%AD%E7%9A%84javascript/
13 楼 lilinpu221 2012-02-10  
看楼主的贴受益很大,浅显易懂,楼主文笔不错
12 楼 robiplus 2011-01-24  
看到这个。。。我的上个问题有点答案了 对于计算器真的是好想法 妙 eval
11 楼 qingpu 2011-01-19  
abruzzi 写道
beykery 写道
这似乎没有什么意义啊。核心部分js解析执行是别人的开源实现。你套个壳子,感觉这个应用不是很精彩。

呵呵,应用程序就是套壳子了。比如信息管理系统,是给数据库的SQL套个壳子;IDE,是给编译器,调试器套个壳子;游戏,是给游戏引擎,脚本引擎套个壳子;WEB开发,是给socket的一个子集套个壳子。如此而已。

+1
10 楼 abruzzi 2011-01-19  
<div class="quote_title">chinpom 写道</div>
<div class="quote_div">
<div class="quote_title">abruzzi 写道</div>
<div class="quote_div">
<div class="quote_title">coffeesweet 写道</div>
<div class="quote_div">楼主可以想象利用这种方式设计一个规则引擎,允许业务人员填写规则脚本。</div>
<br>可以详细说说吗?</div>
<p> </p>
<p><img src="/images/smiles/icon_biggrin.gif" alt=""> 我觉得LZ还是做一个测试用例生成工具比较好。比如有一个输入框它只接受英文字母、中文、数字和下划线(不包含特殊字符),并且长度为4到10位的以英文字母或中文开头的字符串,那它生成的测试用例应该包括以(英文字母开头、中文开头、数字开头、下划线开头、特殊字符开头)长度为3的字符串……当然还有其它很多临界的测试用例。</p>
</div>
<p> </p>
<p>听着不错, 工作上到还确实有个自动测试的项目, 值得研究下, 呵呵.</p>
9 楼 chinpom 2011-01-18  
<p>我自己想用图算法来解决的 <img src="/images/smiles/icon_cry.gif" alt=""> 可是还没再做</p>
8 楼 chinpom 2011-01-18  
当然,还有一些测试条件是有依赖关系的,总之实现起来还真的很复杂。我们在公司做出个大概给测试人员用了一下感觉不理想就放弃了,真的做起来的话,还可以做很多其它功能的,比如生成Excel格式的测试文档等等。
7 楼 chinpom 2011-01-18  
<div class="quote_title">abruzzi 写道</div>
<div class="quote_div">
<div class="quote_title">coffeesweet 写道</div>
<div class="quote_div">楼主可以想象利用这种方式设计一个规则引擎,允许业务人员填写规则脚本。</div>
<br>可以详细说说吗?</div>
<p> </p>
<p><img src="/images/smiles/icon_biggrin.gif" alt=""> 我觉得LZ还是做一个测试用例生成工具比较好。比如有一个输入框它只接受英文字母、中文、数字和下划线(不包含特殊字符),并且长度为4到10位的以英文字母或中文开头的字符串,那它生成的测试用例应该包括以(英文字母开头、中文开头、数字开头、下划线开头、特殊字符开头)长度为3的字符串……当然还有其它很多临界的测试用例。</p>
6 楼 abruzzi 2011-01-18  
coffeesweet 写道
楼主可以想象利用这种方式设计一个规则引擎,允许业务人员填写规则脚本。

可以详细说说吗?
5 楼 coffeesweet 2011-01-18  
楼主可以想象利用这种方式设计一个规则引擎,允许业务人员填写规则脚本。
4 楼 abruzzi 2011-01-18  
beykery 写道
这似乎没有什么意义啊。核心部分js解析执行是别人的开源实现。你套个壳子,感觉这个应用不是很精彩。

呵呵,应用程序就是套壳子了。比如信息管理系统,是给数据库的SQL套个壳子;IDE,是给编译器,调试器套个壳子;游戏,是给游戏引擎,脚本引擎套个壳子;WEB开发,是给socket的一个子集套个壳子。如此而已。
3 楼 beykery 2011-01-18  
这似乎没有什么意义啊。核心部分js解析执行是别人的开源实现。你套个壳子,感觉这个应用不是很精彩。
2 楼 abruzzi 2011-01-18  
λ-lambda 写道
错误处理上貌似很多问题,比如非法表达式等。

,这个正在改进,基本功能倒是都实现了,开发人员总是按照自己的思路去测试,呵呵。还有好几个小项目都在改进。
1 楼 λ-lambda 2011-01-18  
错误处理上貌似很多问题,比如非法表达式等。

相关推荐

    浙江理工大学2017-2019年历年研究生入学考试试卷,代码:930.pdf

    2. 设计实验利用pUC19在大肠杆菌中表达肠杆菌磷酸转移酶(phoC)并检测表达功能。 3. 分析病毒的遗传物质特点及病毒增殖的方式。 4. 讨论细菌产生耐药性的机制,并从微生物学角度分析人类使用抗生素的后果。 5. ...

    zwp-virtual-keyboard:使用wayland-scanner板条为virtual_keyboard_unstable_v1协议生成的Rust代码

    Pinephone或Librem 5上的Phosh / phoc可以理解。 我通常为我的Pinephone构建示例,并在其上打开编辑器。 然后,我使用scp将可执行文件复制到手机并通过ssh执行它。 现在,您应该看到在编辑器中输入了多个'x'字符。...

    概率图模型Probabilistic Graphical Model论文集9

    而"A PHOC Decoder for Lexicon-Free Handwritten Word Recognition"可能介绍了无词典的手写单词识别中的词形编码解码器,利用PGM来处理手写识别中的不确定性。 "Uncertainty Visualization Using Copula-Based ...

    基于ssm的网络教学平台(有报告)。Javaee项目,ssm项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144929660 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    2024年AI代码平台及产品发展简报-V11.pdf

    2024年AI代码平台及产品发展简报-V11

    蓝桥杯JAVA代码.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调;

    QPSK调制解调技术研究与FPGA实现:详细实验文档的探索与实践,基于FPGA实现的QPSK调制解调技术:实验文档详细解读与验证,QPSK调制解调 FPGA设计,有详细实验文档 ,QPSK调制解调; FPGA设计; 详细实验文档,基于QPSK调制的FPGA设计与实验文档

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研

    PID、ADRC和MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的Simulink仿真研究,PID、ADRC与MPC轨迹跟踪控制器在Matlab 2018与Carsim 8中的仿真研究,PID, ADRC和MPC轨迹跟踪控制器Simulink仿真模型。 MPC用于跟踪轨迹 ADRC用于跟踪理想横摆角 PID用于跟踪轨迹 轨迹工况有双移线,避障轨迹,正弦轨迹多种 matlab版本为2018,carsim版本为8 ,PID; ADRC; MPC; 轨迹跟踪控制器; Simulink仿真模型; 双移线; 避障轨迹; 正弦轨迹; MATLAB 2018; CarSim 8,基于Simulink的PID、ADRC与MPC轨迹跟踪控制器仿真模型研究

    基于Springboot的个性化图书推荐系统。Javaee项目,springboot项目。

    重点:所有项目均附赠详尽的SQL文件,这一细节的处理,让我们的项目相比其他博主的作品,严谨性提升了不止一个量级!更重要的是,所有项目源码均经过我亲自的严格测试与验证,确保能够无障碍地正常运行。 1.项目适用场景:本项目特别适用于计算机领域的毕业设计课题、课程作业等场合。对于计算机科学与技术等相关专业的学生而言,这些项目无疑是一个绝佳的选择,既能满足学术要求,又能锻炼实际操作能力。 2.超值福利:所有定价为9.9元的项目,均包含完整的SQL文件。如需远程部署可随时联系我,我将竭诚为您提供满意的服务。在此,也想对一直以来支持我的朋友们表示由衷的感谢,你们的支持是我不断前行的动力! 3.求关注:如果觉得我的项目对你有帮助,请别忘了点个关注哦!你的支持对我意义重大,也是我持续分享优质资源的动力源泉。再次感谢大家的支持与厚爱! 4.资源详情:https://blog.csdn.net/2301_78888169/article/details/144486173 更多关于项目的详细信息与精彩内容,请访问我的CSDN博客!

    Matlab实现Transformer-Adaboost时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:本文档详细介绍了一个利用Matlab实现Transformer-Adaboost结合的时间序列预测项目实例。项目涵盖Transformer架构的时间序列特征提取与建模,Adaboost集成方法用于增强预测性能,以及详细的模型设计思路、训练、评估过程和最终的GUI可视化。整个项目强调数据预处理、窗口化操作、模型训练及其优化(包括正则化、早停等手段)、模型融合策略和技术部署,如GPU加速等,并展示了通过多个评估指标衡量预测效果。此外,还提出了未来的改进建议和发展方向,涵盖了多层次集成学习、智能决策支持、自动化超参数调整等多个方面。最后部分阐述了在金融预测、销售数据预测等领域中的广泛应用可能性。 适合人群:具有一定编程经验的研发人员,尤其对时间序列预测感兴趣的研究者和技术从业者。 使用场景及目标:该项目适用于需要进行高质量时间序列预测的企业或机构,比如金融机构、能源供应商和服务商、电子商务公司。目标包括但不限于金融市场的波动性预测、电力负荷预估和库存管理。该系统可以部署到各类平台,如Linux服务器集群或云计算环境,为用户提供实时准确的预测服务,并支持扩展以满足更高频率的数据吞吐量需求。 其他说明:此文档不仅包含了丰富的理论分析,还有大量实用的操作指南,从项目构思到具体的代码片段都有详细记录,使用户能够轻松复制并改进这一时间序列预测方案。文中提供的完整代码和详细的注释有助于加速学习进程,并激发更多创新想法。

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂 该案例是文献复现,文献与案例一起 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破

    液滴穿越障碍:从文献到案例的复现研究,液滴破裂与障碍物穿越:文献复现案例研究,液滴生成并通过障碍物破裂。 该案例是文献复现,文献与案例一起。 ,液滴生成; 障碍物破裂; 文献复现; 案例研究,液滴破裂:障碍挑战的文献复现案例

    蓝桥杯练习题_2.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    蓝桥杯笔记,用于个人学习进步.zip

    蓝桥杯算法学习冲刺(主要以题目为主)

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升 ,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提

    基于最小递归二乘法的MPC自适应轨迹跟踪控制优化 针对轮胎刚度时变特性提升模型精度与鲁棒性,仿真验证满足车辆低速高精度跟踪与高速稳定性提升。,基于变预测时域MPC自适应轨迹跟踪控制与轮胎侧偏刚度优化提升模型精度和鲁棒性,基于变预测时域的MPC自适应轨迹跟踪控制,针对轮胎刚度时变的特点造成控制模型精度降低,基于最小递归二乘法(RLS)估算的轮胎侧偏刚度,提升了模型的控制精度和鲁棒性,通过carsim与simulink联合仿真结果发现,改进后的轨迹跟踪控制器既满足了车辆低速行驶下的轨 迹跟踪精度,也一定程度上克服了高速下车辆容易失去稳定性的问题。 有详细的lunwen分析说明和资料,以及本人的,仿真包运行。 ,基于变预测时域的MPC; 自适应轨迹跟踪控制; 轮胎刚度时变; 控制模型精度降低; 最小递归二乘法(RLS)估算; 模型控制精度和鲁棒性提升; carsim与simulink联合仿真; 轨迹跟踪控制器; 车辆稳定性。,基于变预测时域MPC的轮胎刚度自适应轨迹跟踪控制策略研究

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计

    GMSK调制解调技术研究:基于FPGA设计与实验详解,GMSK调制解调技术详解:基于FPGA设计的实验文档与实践应用,GMSK调制解调 FPGA设计,有详细实验文档 ,GMSK调制解调; FPGA设计; 详细实验文档; 实验结果分析,GMSK调制解调技术:FPGA设计与实验详解

    (源码)基于Arduino和Python的Cansat卫星系统.zip

    # 基于Arduino和Python的Cansat卫星系统 ## 项目简介 本项目是一个Cansat卫星系统,旨在设计和实现一个小型卫星模型,通过火箭发射至1公里高空,并使用地面站接收其传输的数据。项目涉及Arduino编程、Python数据处理和可视化。 ## 主要特性和功能 1. 硬件组件 使用Arduino Nano作为Cansat的微控制器。 搭载BMP 280温度和压力传感器、ATGM336H GPS模块、LoRa通信模块等。 地面站使用Arduino Uno和LoRa通信模块接收数据。 2. 数据处理 使用Python进行数据处理和可视化,包括数据清洗、计算风速、绘制温度、压力、风速和海拔随时间变化的图表等。 3. 通信与控制 通过LoRa模块实现Cansat与地面站之间的数据传输。 提供实时监视和记录数据的脚本。 ## 安装和使用步骤 ### 1. 硬件准备

    LongSung-USB-Drivers-V2.0-for-Windows

    U9300C 龙尚4G模块安装后模块才能正常使用,win7 win10驱动程序,支持USB转接板。

    (源码)基于Arduino平台的物联网温湿度监控系统.zip

    # 基于Arduino平台的物联网温湿度监控系统 ## 项目简介 这是一个基于Arduino平台的物联网温湿度监控项目,旨在通过简单的硬件设备实现环境数据的实时监测与远程管理。该项目适用于智能家居、农业种植等领域。 ## 项目的主要特性和功能 1. 温湿度数据采集通过Arduino板连接温湿度传感器,实时采集环境数据。 2. 数据传输将采集到的数据通过无线网络模块发送到服务器或远程终端。 3. 数据可视化可在电脑或移动设备端展示实时的温湿度数据。 4. 报警功能当温湿度数据超过预设阈值时,自动触发报警通知。 ## 安装使用步骤 前提假设用户已经下载了本项目的源码文件。以下是简单明了的安装使用步骤 1. 环境准备安装Arduino开发环境,配置必要的硬件接口。 2. 硬件连接将Arduino板与温湿度传感器、无线网络模块连接。 3. 代码上传将本项目提供的Arduino代码上传至Arduino板。

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求

    基于需求响应与清洁能源接入的配电网重构优化:综合成本与混合整数凸规划模型分析(matlab实现),基于需求响应与清洁能源接入的配电网重构算法研究:网损与成本优化的仿真分析,高比例清洁能源接入下计及需求响应的配电网重构(matlab代码) 该程序复现《高比例清洁能源接入下计及需求响应的配电网重构》,以考虑网损成本、弃风弃光成本和开关操作惩罚成本的综合成本最小为目标,针对配电网重构模型的非凸性,引入中间变量并对其进行二阶锥松弛,构建混合整数凸规划模型,采用改进的 IEEE33 节点配电网进行算例仿真,分析了需求响应措施和清洁能源渗透率对配电网重构结果的影响。 该程序复现效果和出图较好(详见程序结果部分),注释清楚,方便学习 ,高比例清洁能源; 需求响应; 配电网重构; 二阶锥松弛; 综合成本最小化; MATLAB代码; IEEE33节点配电网; 复现效果; 出图; 注释清楚。,Matlab代码复现:高比例清洁能源接入下的配电网重构模型与需求响应分析

Global site tag (gtag.js) - Google Analytics