phoc 中的脚本
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
phoc 中包含两个脚本文件,分别为 math.js 和 plot.js。math.js 中对 JavaScript 的内 建 Math 函数做了一个重定义和包装,plot.js 则对 jmathtool 工具包做了 Java-JavaScript 的转换,使得在 phoc 中使用 JavaScript 函数来绘制 2d 和 3d 的图形。
var PI = Math.PI;
var E = Math.E;
function sqrt(x){
return Math.sqrt(x);
}
function sin(x){
return Math.sin(x);
}
function cos(x){
return Math.cos(x);
}
function sum(){
var result = 0;
for(var i = 0, len = arguments.length; i < len; i++){
var current = arguments[i];
if(isNaN(current)){
throw new Error("not a number exception");
}else{
result += current;
}
}
return result; }
math.js 的部分代码,目的仅为在 phoc 的函数定义器及输入框中减少输入量。这个脚本无需展开讨论,下面看一下 plot.js:
importPackage(Packages.javax.swing)
importPackage(java.awt)
importClass(org.math.array.DoubleArray)
importClass(org.math.plot.Plot2DPanel)
importClass(org.math.plot.Plot3DPanel)
/**
* a little helper for plot
*/
function increment(start, step, stop){
var x = [];
for(start; start+step < stop; start += step){
x.push(start);
}
}
首先导入”org.math.array.DoubleArray”及”org.math.plot.*”,jmathtool 的绘图接口 包装在 Plot2DPanel 和 Plot2DPanel 中。
/**
* i.e.
* plot(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);
}
/**
* plot function 3d
*/
function plot3d(func, xrange, yrange){
var x = DoubleArray.increment(xrange.start, xrange.step,
xrange.stop);
var y = DoubleArray.increment(yrange.start, yrange.step,
yrange.stop);
var name = func.toString();
var z = (function(x, y){
var dims = new Array(y.length, x.length);
var r =
java.lang.reflect.Array.newInstance(java.lang.Double.TYPE, dims); for(var i = 0, len = x.length; i < len; i++){
for(var j = 0, len2 = y.length; j < len2; j++){
r[j][i] = func(x[i], y[j]);
}
}
return r;
})(x, y);
var plot = new Plot3DPanel("SOUTH");
plot.addGridPlot(name, x, y, z);
var frame = new JFrame("plot function : "+name);
frame.setSize(600, 600);
frame.setContentPane(plot);
frame.setVisible(true);
}
使用 jmathtool 的 Plot*DPanel 产生新的 Panel,然后创建新的 JFrame 对象,并将 Panel 添加在 JFrame 上管理。
在线练习
{$ activeFileHint $}