欢迎访问 Lu程序设计

Lu窗口库LuWin

目  录

1 什么是LuWin

2 ChartWnd 使用数据可视化库CChart。请参考:在Lu脚本中使用CChart绘图系列教程, 或者访问:CChart官方网站
win::ChartWnd 显示窗口并进行初始化。
win::cwAttach 设置图像类型,并粘到窗口。
win::cwAddCurve 添加二维曲线。
win::cwAddCurve3D(pX, pY, pZ, nLen) 添加三维曲线。pX、pY和pZ是一维实数数组,nLen是数据个数。运行错误:1:参数不符合要求。
win::cwUpdateCurve(nDataIndex, pX, pY, nLen, nPlotIndex) 更新曲线数据。nDataIndex是曲线的序号,pX和pY是一维实数数组,nLen是数据个数,nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。运行错误:1:参数个数不符合要求;2:参数不符合要求。
win::cwUpdateCurveByID(nDataID, pX, pY, nLen, nPlotIndex) 根据ID号更新曲线数据。nDataID是曲线的ID,pX和pY是一维实数数组,nLen是数据个数,nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。运行错误:1:参数个数不符合要求;2:参数不符合要求。
win::cwSetLangurage(k) 设置对话框、右键菜单使用的语言。k=0为英文,k=1为中文。默认使用中文。返回逻辑值,true表示成功。
win::cwSetConfineRect(left,top,right,botton) 设置限制区域。left,top,right,botton为客户区坐标。返回逻辑值,true表示成功。
win::cwGetConfineRect(&left,&top,&right,&botton) 获取限制区域,必须使用取地址运算符&。left,top,right,botton为客户区坐标。返回逻辑值,true表示成功。
win::cwIsEmpty() 测试内部是否无数据。返回逻辑值,true表示有数据。
win::cwAddPoint2D(x, y, nCurve, nPlot)
win::cwAddPoint2D(strTime,fmt,y,nCurve,nPlot)
添加2维曲线的一个数据点。strTime是字符串格式的时间,字符串格式由fmt说明。nCurve表示曲线的序号,nCurve如果等于当前曲线的条数,则新增一条曲线,如果小于0或者大于当前曲线条数,则添加失败;nPlot是分裂视图、分层视图、共享X轴视图的子图序号。nCurve和nPlot可以缺省。返回曲线序号。
win::cwAddPoint3D(x, y, z, nCurve) 添加3维曲线的一个数据点。nCurve表示曲线的序号,nCurve如果等于当前曲线的条数,则新增一条曲线,如果小于0或者大于当前曲线条数,则添加失败;nCurve可以缺省。返回曲线序号。
win::cwClearData 清除曲线数据。
win::cwSetReservedDataLength(nLen, nPlotIndex) 为曲线预留内存空间,主要目的是加快速度。如果根据实际情况预留了内存,则会一次性成功分配内存。nLen为曲线数据数目,nPlotIndex是曲线的序号。返回逻辑值,true表示成功。
win::cwGetIndex(idData, nPlot) 从曲线的idData(曲线的唯一标识)获得曲线的序号nIndex(序号是连续的),nPlot是分裂视图、分层视图、共享X轴视图的子图序号;若缺省nPlot,默认0子图。
运行错误:1:参数个数不符合要求;2:参数不符合要求。
win::cwGetDataID(nIndex, nPlot) 从曲线的序号nIndex(序号是连续的)获得曲线的idData(曲线的唯一标识),nPlot是分裂视图、分层视图、共享X轴视图的子图序号;若缺省nPlot,默认0子图。
运行错误:1:参数个数不符合要求;2:参数不符合要求。
win::cwAddPie(value, title) 添加饼图的一个值。value为实数,字符串title用于设置饼的标题,可缺省。运行错误:1:参数个数不符合要求;2:参数不符合要求。
win::cwAddStems(pData, nLen, title) 添加柱图的一个序列。pData是一维实数数组,nLen是数据个数,字符串title用于设置 柱的标题,可缺省。 运行错误:1:参数个数不符合要求;2:参数不符合要求。
win::cwSetFieldFcn(@f) 设置场函数f,用于等高线图、云图、三维曲面图。f为二元函数句柄,必须返回一个实数。运行错误:1:找不到场函数;2:场函数不是二元函数。
win::cwGetType() 获取图像类型,返回其编码(整数)。
win::cwSetType(nType) 设置图像类型。返回逻辑值,true表示成功。
win::cwAddLayer() 增加一个图层,用于分层视图、共享X轴视图。返回一个整数,表示图层号。
win::cwResizePlots 设置子图数量或图层数量。
win::cwSetPlotRange(X1, X2, Y1, Y2) 设置X坐标轴和Y坐标轴的范围,常用于typeContourLine(等高线图)。返回逻辑值,true表示成功。
win::cwGetLastPlotRange(&X1, &X2, &Y1, &Y2, nPlotIndex) 获取X坐标轴和Y坐标轴的范围。nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号,缺省值为0。返回逻辑值,true表示成功。
win::cwSetXRange(low, high, nPlot) 设置X坐标轴范围,nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetYRange(low, high, nPlot) 设置Y坐标轴范围,nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetXExactRange(bExact, nPlot) 设置X坐标轴范围与数据范围相同,不向两端扩展。bExact为逻辑值;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetYExactRange(bExact, nPlot) 设置Y坐标轴范围与数据范围相同,不向两端扩展。bExact为逻辑值;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetEqualXYAxis(bEqual) 设置坐标轴等长,只对typeXY有效。bExact为逻辑值。返回逻辑值,true表示成功。
win::cwSetEqualXYRange(bEqual) 设置坐标轴等范围,只对typeXY有效。bExact为逻辑值。返回逻辑值,true表示成功。
win::cwSetEqualXYScale(bEqual) 设置坐标轴等比例尺,只对typeXY有效。bExact为逻辑值。返回逻辑值,true表示成功。
win::cwSetTitle(title, nPlot) 设置图像标题。title为标题字符串;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetShowParentTitle(bSet) 分层视图显示主标题。bSet为逻辑值。返回逻辑值,true表示成功。
win::cwSetDataTitle(title, nData, nPlot) 设置数据标题。title为标题字符串;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetDataColor(color, nData, nPlot) 设置数据颜色。color为数据颜色;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetDataLineStyle(nStyle, nData, nPlot) 设置数据样式。nStyle为数据样式;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetDataLineSize(nSize, nData, nPlot) 设置数据大小。nSize为数据大小;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetPlotType(nType, nData, nPlot) 设置曲线的绘制方式。nType为曲线样式;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetMarkerShow(bShow, nData, nPlot) 设置曲线数据点标记是否显示。bShow为逻辑值;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetMarkerFill(bFill, nData, nPlot) 设置曲线数据点标记是否填充。bFill为逻辑值;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetMarkerType(nType, nData, nPlot) 设置曲线数据点标记的形状。nType为标记的形状;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetMarkerSize(nSize, nData, nPlot) 设置曲线数据点的大小。nSize为标记的形状;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetMarkerFreq(nFreq, nData, nPlot) 设置曲线数据点标记频率,0表示不标记,正n表示每隔n个点标记一次,负n表示一共标记n个点。nFreq为标记频率;nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetScatter(nData, nPlot) 设置曲线散点显示模式。nData为曲线的Index;nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetLegendShow(bUse, nPlot) 设置是否使用图例。nPlot是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetContourLineNum(num) 设置等高线图等高线的数量。返回逻辑值,true表示成功。
win::cwSetContourPrecision(n) 设置等高线图等高线绘制的精度,n越大,精度越高,一般5就可以了。返回逻辑值,true表示成功。
win::cwSetRangeZoomMode(zoom) 设置内置缩放模式,打开后可响应鼠标拖放。zoom为逻辑值。返回逻辑值,true表示成功。
win::cwSetRangeZoomType(nType) 设置坐标缩放的选项:0-X,1-Y,2-XY。nType为整数。返回逻辑值,true表示成功。
win::cwSetRangeDragMode(drag) 设置坐标拖动模式。drag为逻辑值。返回逻辑值,true表示成功。
win::cwSetRangeDragType(nType) 设置坐标拖动的选项:0-X,1-Y,2-XY。nType为整数。返回逻辑值,true表示成功。
win::cwResetDZRanges() 重置缩放范围。
win::cwAddAxis(location, nPlotIndex) 增加坐标轴。location表示轴的位置:0 左轴;1 下轴;2 右轴;3 上轴;4 中轴竖直偏左;5 中轴竖直偏右;6 中轴水平偏下;7 中轴水平偏上;8 三维X轴;9 三维Y轴;10三维Z轴。nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号,可以缺省。返回逻辑值,true表示成功。
win::cwSetAxisTitle(title, location, nPlotIndex) 设置坐标轴标题。title为标题字符串;location和nPlotIndex参考函数cwAddAxis中的说明。返回逻辑值,true表示成功。
win::cwSetAxisToTime(bTime, location, nPlotIndex) 设置时间坐标轴。bTime为逻辑值;location和nPlotIndex参考函数cwAddAxis中的说明。返回逻辑值,true表示成功。
win::cwSetAxisLabelShow(bShow, location, nPlotIndex) 设置坐标轴是否显示刻度值。bShow为逻辑值;location和nPlotIndex参考函数cwAddAxis中的说明。返回逻辑值,true表示成功。
win::cwSetPieTitle(title, which) 设置饼图单个饼的标题。title为标题字符串;which为饼图序号。返回逻辑值,true表示成功。
win::cwSetPieColor(color, which) 设置饼图单个饼的颜色。color为颜色值;which为饼图序号。返回逻辑值,true表示成功。
win::cwSetStemLabel(label, which) 设置柱图单根柱子的标签。label为标签字符串;which为柱子序号。返回逻辑值,true表示成功。
win::cwSetStemTitle(title, nDataIndex) 设置柱图单个序列的标题。title为标题字符串;nDataIndex是数据序号。返回逻辑值,true表示成功。
win::cwSetGridBindLayer(nPlotIndex) 设置背景网格与哪一个子图绑定,用于共享X轴视图。nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号。返回逻辑值,true表示成功。
win::cwSetGridLine 设置网格线的绘制。
win::cwSetBkgndColor(color, nPlotIndex) 设置背景颜色color。nPlotIndex是分裂视图、分层视图、共享X轴视图的子图序号 ,缺省值为0。返回逻辑值,true表示成功。
win::cwSetLRAxis() 在分层视图和分裂视图中,设置第一层显示左坐标轴,第二层显示右坐标轴。
win::cwSetTBAxis() 在分层视图中,设置第一层显示下坐标轴,第二层显示上坐标轴。--该函数运行出错,暂时勿用!
win::cwSetVKFor 设置虚拟键函数,使用户通过虚拟键控制图形显示,返回值无意义。
win::cwSetMouseFor 设置鼠标函数,使用户通过鼠标图形显示,返回值无意义。
win::cwSetExeMsg() 用户通过cwSetExe设定函数后,通过cwSetExeMsg发送执行消息,返回值无意义。 该函数可在任意线程中执行。
win::cwSetExe(@f) 设置可通过cwSetExeMsg发送消息执行的函数f,返回逻辑值。运行错误:1:非法的函数句柄。
win::cwSetTimer(@f, Ellapse, bRun) 设置通过内置定时器执行的函数f,返回逻辑值。Ellapse为计时间隔(毫秒)。若bRun=true,则立即启动计时器;否则在窗口手动启动计时器。Ellapse和bRun均可缺省,缺省值Ellapse=500,bRun=false。运行错误:1:参数个数不符合要求;2:参数不符合要求;3:非法的函数句柄。

以下是用Lu脚本定义的实用绘图函数,可在OpenLu环境中可直接使用,函数定义位置: module\ChartWnd实用函数.txt

luShareX(data) 绘制共享X轴视图。data是一个矩阵或者二维数组。
luShareX2(data1, data2) 绘制共享X轴视图。data1和data2是两个矩阵或者二维数组。 用于比较data1和data2的差别。
luPlot(data) 绘制一元函数共享X轴图形。data是一个lu对象。
3 LuWin函数
win::Plot 动态绘制一元函数及数组图形。
win::PlotExe 向Plot发送执行函数命令并刷新图形。
win::FunTimer 使用计时器定时执行函数。
win::SetPara 设置可通过参数修改窗口修改的参数。
win::GetWin(k) 获得窗口句柄。k=hPlot时获得Plot窗口的句柄;k=hChartWnd时获得ChartWnd窗口的句柄。
win::RGB(r,g,b) 定义绘图颜色。r,g,b分别表示红色值、绿色值和蓝色值。r,g,b取值范围均为0~255。
win::MessageBox 消息框函数。
win::GetFileName(str) 选择一个文件名。字符串str显示到打开文件对话框的标题栏中,可缺省此参数。返回一个动态字符串,包含了所选择的文件名,若用户放弃选择,返回一个空串。
运行错误:1:参数个数不符合要求;2:非法的字符串;3:内存错误。

1 什么是LuWin [返回页首]

    LuWin64.dll是一个Lu扩展动态库,主要包含一些窗口函数,特别是绘制2D3D图形的函数。多线程动态绘制图形是LuWin的基本特点。

    LuWin主要由 网友笨笨开发的数据可视化库CChart提供支持,保留所有权利。 笨笨兄的E-mailbaita00@aliyun.comQQ、微信:1541583,官方网站:www.cchart.net

    在LuWin中的函数是通过二级函数命名空间“win”输出的,所有函数均具有类似“win::Plot(...)”的格式。使用!!!using("win");可简化LuWin中的函数访问。

    LuWin64.dll需要MLu64.dll的支持。

2 ChartWnd [返回页首]

    LuWin中的ChartWnd直接对数据可视化库CChart的包装类CChartWnd中的函数进行了封装。ChartWnd在独立的线程中运行,用户在ChartWnd窗口进行键盘或鼠标操作时,会转换为相应的Lu函数调用,以获取数据及属性进行绘图。 除函数cwSetExeMsg外,其他以cw开头的函数,只有在ChartWnd窗口线程中调用时,才会起作用。ChartWnd既可静态显示图形,也可动态显示图形。ChartWnd的动态运行机制见下图:

[返回页首] win::ChartWnd(@init):显示窗口并进行初始化。

    init:初始化函数句柄 ,仅在窗口创建时调用一次。一般在初始化函数中添加图形数据、属性、用户操作图形界面时需要调用的函数等。

    返回值:窗口句柄。

    运行错误:1:非法的函数句柄。

    [例子]:

!!!using("win","math");    //使用命名空间win和math
~~~init()=
cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,1,2,6], 5};  //初始化函数,只编译,不执行
ChartWnd[@init];
          //显示窗口

[返回页首] win::cwAttach(type, left,top,right,botton):设置图像类型,并粘到窗口。

    type:图像类型。可取的值为:typeXY(折线图、普通XY图)、typePie(饼图)、typeStem(柱图)、typeOscillo(模拟示波器图)、typeContourLine(等高线图)、typeContourMap( 等高云图)、typeSplit(分裂视图)、typeShareX(共享X轴视图)、typeLayered(分层视图)、type3DLine(三维折线图、3D曲线图)、type3DSurface(三维曲面图、3D曲面图)。
    left,top,right,botton:客户区坐标。

    返回值:逻辑值true或false。

    运行错误:1:参数个数不符合要求;2:非法的绘图类型;3: 非法的客户区坐标。

    用法1:cwAttach()       //默认typeXY类型
    用法2:
cwAttach(type)
    用法3:
cwAttach(type, left,top,right,botton)

    [例子1]:饼图

!!!using("win");    //使用命名空间win
init(x)=
cwAttach[typePie], cwAddPie[28.0], cwAddPie[38.0, "这个最大"], cwAddPie[32.0];  //初始化函数,参数x使得函数init只编译,不执行
ChartWnd[@init];
   //显示窗口

 

   [例子2]:等高线

!!!using("win");
f(x,y)= 1.0/[(x-1.0)*(x-1.0)+y*y+1.0];
init(x)=
cwAttach[typeContourLine], cwSetFieldFcn[@f];
ChartWnd[@init];

   [例子3]:云图

!!!using("win");
f(x,y)= 1.0/((x-1.0)*(x-1.0)+y*y+1.0) + 1.0/((x+1.0)*(x+1.0)+y*y+1.0);
init(x)=
cwAttach[typeContourMap], cwSetFieldFcn[@f], cwSetPlotRange[-2.0,2.0, -2.0,2.0];
ChartWnd[@init];

    [例子4]:柱图

!!!using("win","math");
init(x)=
cwAttach[typeStem], cwAddStems{ra1[1,2,3,4,5],5}, cwAddStems{ra1[3,2,5,4,1],5,"二月"};
ChartWnd[@init];

    [例子5]:3D曲线

!!!using("win","math");
init(x)=
cwAttach(type3DLine), x=linspace[0.0,20.0,100], cwAddCurve3D{x, cos(x), sin(x), 100};
ChartWnd[@init];

    [例子6]:3D曲面

!!!using("win");
f(x,y)=(x^2-2*x)*exp(-(x^2)-y^2-x*y);
init(x)= cwAttach(type3DSurface), cwSetFieldFcn[@f], cwSetPlotRange[-3.0,3.0,-5.0,5.0];
ChartWnd[@init];

    [例子7]:定时器例子:自动演示一段折线动画

!!!using("win","math");
f(x:static,k)=
cwClearData(), cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,(k++)%10,2,6], 5};
init(x)=
cwSetTimer[@f, 500, true];
ChartWnd[@init];

    [例子8]:参数修改窗口控制的例子

!!!using("win","math");
initk(::k)= k=0.0;
      //初始化k
f(x::k)=
cwClearData(), cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,k,2,6], 5};
修改k(m,x::k)=
which{m==0:k, m==1:[k=k+x], m==2:[k=k-x], m==3:[k=x], cwSetExeMsg()}; //修改模块变量k并刷新ChartWnd窗口的函数
init(x)=
cwSetExe[@f];
ChartWnd[@init];
SetPara{GetWin(hChartWnd),  //获得ChartWnd函数的窗口句柄。可以缺省该参数获得另一效果。
     @
修改k,1.0         //使参数k可动态修改
};

[返回页首] win::cwAddCurve(... ...):添加二维曲线

    用法1:cwAddCurve()                          //默认0号子图,添加空曲线
    用法2:cwAddCurve(nPlot)
                     //添加nPlot号子图空曲线
    用法3:cwAddCurve(pX, pY, nLen)
              //默认0号子图,添加曲线:pX和pY是一维实数数组,nLen是数据个数
    用法4:cwAddCurve(pX, pY, nLen, nPlot)       //添加nPlot号子图曲线:pX和pY是一维实数数组,nLen是数据个数
    用法5:cwAddCurve(pStrTime, fmt, pY, nLen)        //默认0号子图,添加曲线:X坐标pStrTime是时间字符串 ,fmt是格式字符串;Y坐标pY是一维实数数组,nLen是数据个数
    用法6:cwAddCurve(pStrTime, fmt, pY, nLen, nPlot) //添加nPlot号子图曲线:X坐标pStrTime是时间字符串 ,fmt是格式字符串;Y坐标pY是一维实数数组,nLen是数据个数

    时间字符串pStrTime(包含nLen个时间字符串,每个时间字符串之间用字符"\%"分隔)的格式由格式字符串fmt解释,fmt包含了普通字符和特殊格式说明符的任何组合,说明符意义见下表:

说明符

意义

实例

 

说明符

意义

实例

%a 缩写的星期几名称 Sun %p AM 或 PM 名称 PM
%A 完整的星期几名称 Sunday %S 秒(00-61) 02
%b 缩写的月份名称 Mar %U 一年中的第几周,以第一个星期日作为第一周的第一天(00-53) 33
%B 完整的月份名称 March %w 十进制数表示的星期几,星期日表示为 0(0-6) 4
%c 日期和时间表示法 Sun Aug 19 02:56:02 2012 %W 一年中的第几周,以第一个星期一作为第一周的第一天(00-53) 34
%d 一月中的第几天(01-31) 19 %x 日期表示法 08/19/12
%H 24 小时格式的小时(00-23) 14 %X 时间表示法 02:50:06
%I 12 小时格式的小时(01-12) 05 %y 年份,最后两个数字(00-99) 01
%j 一年中的第几天(001-366) 231 %Y 年份 2012
%m 十进制数表示的月份(01-12) 08 %Z 时区的名称或缩写 CDT
%M 分(00-59) 55 %% 一个 % 符号 %

    例如:时间字符串pStrTime="2018-09-19 08:59:07\%2018-09-20 08:59:07\%2018-09-20 09:59:07\%",格式字符串fmt="%Y-%m-%d %H:%M:%S"。

    返回值:曲线的ID号,注意不是序号,返回-1表示添加曲线失败。

    运行错误:1:参数个数不符合要求;2:参数不符合要求 ;3:内存错误。

[返回页首] win::cwClearData(nData, nPlot):清除曲线数据。

    nData:曲线的序号nIndex。
    nPlot:分裂视图、分层视图、共享X轴视图的子图序号。

    用法1:cwClearData()             //清除全部曲线数据
    用法2:cwClearData(nPlot)
        //清除nPlot子图所有曲线数据
    用法3:cwClearData(nData, nPlot)
 //清除nPlot子图的第nData条曲线数据

    返回值:无意义。

    运行错误:1:参数个数不符合要求;2:参数不符合要求。

[返回页首] win::cwResizePlots(...):设置子图数量或图层数量。

    用法1:cwResizePlots(nLayers)             //设置图层数量,用于分层视图、共享X轴视图,nLayers为大于0的整数。
    用法2:cwResizePlots(mode, nRows, nCols)
  //设置子图数量,用于分裂视图,其中mode(0~5)表示分裂模式;nRows(大于0)表示行数,nCols(大于0)表示列数 ,这两个参数只有mode为1时起作用。

    分裂视图的分裂模式:0表示不分裂;1表示行列分裂;2表示左一右二的三分裂;3表示左二右一的三分裂;4表示上一下二的三分裂;5表示上二下一的三分裂。

    返回值:逻辑值,true表示成功。

    [例子1]:共享X轴视图

!!!using("win","math");
init(x)=
 
cwAttach[typeShareX], cwResizePlots(2),
 
cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,1,2,6], 5, 0},
  cwAddCurve{ra1[1,2,3,4,5], ra1[100,300,600,200,500], 5, 1},
  cwSetLRAxis();
ChartWnd[@init];

    [例子2]:分层视图

!!!using("win","math");
init(x)=
 
cwAttach[typeLayered], cwResizePlots(2),
 
cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,1,2,6], 5, 0},
  cwAddCurve{ra1[12,22,33,44,55], ra1[100,300,600,200,500], 5, 1};
ChartWnd[@init];

    [例子3]:分裂视图

!!!using("win","math");
init(x)=
 
cwAttach[typeSplit], cwResizePlots(2,2,2),
 
cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,1,2,6], 5, 0},
  cwAddCurve{ra1[-1,-2,3,4,5], ra1[100,300,600,200,500], 5, 1},
  cwAddCurve{ra1[1,2,3,33,55], ra1[10,30,60,20,50], 5, 2};
ChartWnd[@init];

[返回页首] win::cwSetGridLine(... ...):设置网格线的绘制

    用法1:cwSetGridLine(MajorH, MajorV, MinorH, MinorV, nPlotIndex)

    说明:MajorH, MajorV, MinorH, MinorV为逻辑值;nPlotIndex为整数,是分裂视图、分层视图、共享X轴视图的子图序号 。所有参数均可缺省,缺省值为:MajorH=true, MajorV=true, MinorH=false, MinorV=false。返回逻辑值,true表示成功。

    用法2:cwSetGridLine(MajorXY, MinorXY, MajorYZ, MinorYZ, MajorZX, MinorZX)

    说明:用于设置三维曲线的网格。所有参数均为逻辑值。返回逻辑值,true表示成功。

[返回页首] win::cwSetVKFor(iVK, @f):设置虚拟键函数,使用户通过虚拟键控制图形显示。

    iVK:虚拟键代码,可取的值为0~165。
    f:用户按键时执行的函数。

    返回值:逻辑值。

    运行错误:1:参数不符合要求。

    以下虚拟键名称已经定义,可以在程序中直接使用。

虚拟键 十六进制值 十进制值 相应键盘或鼠标键   虚拟键 十六进制值 十进制值 相应键盘或鼠标键
VK_LBUTTON 1 1 鼠标左键   VK_NUMPAD7 67 103 小数字键盘7键
VK_RBUTTON 2 2 鼠标右键   VK_NUMPAD8 68 104 小数字键盘8键
VK_CANCEL 3 3 Ctrl-Break   VK_NUMPAD9 69 105 小数字键盘9键
VK_MBUTTON 4 4 鼠标中键   VK_MULTIPLY 6A 106 乘号键
VK_BACK 8 8 Backspace   VK_ADD 6B 107 加号键
VK_TAB 9 9 Tab   VK_SEPARATOR 6C 108 分割键
VK_CLEAR 0C 12 Clear   VK_SUBSTRACT 6D 109 减号键
VK_RETURN 0D 13 Enter   VK_DECIMAL 6E 110 小数点键
VK_SHIFT 10 16 Shift   VK_DIVIDE 6F 111 除号键
VK_CONTROL 11 17 Ctrl   VK_F1 70 12 F1
VK_MENU 12 18 Alt   VK_F2 71 113 F2
VK_PAUSE 13 19 Pause   VK_F3 72 114 F3
VK_CAPITAL 14 20 Caps Lock   VK_F4 73 115 F4
VK_ESCAPE 1B 27 Esc   VK_F5 74 116 F5
VK_SPACE 20 32 Space   VK_F6 75 117 F6
VK_PRIOR 21 33 PageUp   VK_F7 76 118 F7
VK_NEXT 22 34 PageDown   VK_F8 77 119 F8
VK_END 23 35 End   VK_F9 78 120 F9
VK_HOME 24 36 Home   VK_F10 79 121 F10
VK_LEFT 25 37 ←键   VK_F11 7A 122 F11
VK_UP 26 38 ↑键   VK_F12 7B 123 F12
VK_RIGHT 27 39 →键   VK_F13 7C 124 F13
VK_DOWN 28 40 ↓键   VK_F14 7D 125 F14
VK_SELECT 29 41 Select   VK_F15 7E 126 F15
VK_PRINT 2A 42 Print   VK_F16 7F 127 F16
VK_EXECUTE 2B 43 Execute   VK_F17 80 128 F17
VK_SNAPSHOT 2C 44 Print Screen   VK_F18 81 129 F18
VK_INSERT 2D 45 Ins   VK_F19 82 130 F19
VK_DELETE 2E 46 Del   VK_F20 83 131 F20
VK_HELP 2F 47 Help   VK_F21 84 132 F21
VK_LWIN 5B 91 左windows键   VK_F22 85 133 F22
VK_RWIN 5C 92 右windows键   VK_F23 86 134 F23
VK_APPS 5D 93 应用程序键   VK_F24 87 135 F24
VK_SLEEP 5F 95 休眠键   VK_NUMLOCK 90 144 Num Lock键
VK_NUMPAD0 60 96 小数字键盘0键   VK_SCROLL 91 145 Scroll Lock键
VK_NUMPAD1 61 97 小数字键盘1键   VK_LSHIFT A0 160 左Shift键
VK_NUMPAD2 62 98 小数字键盘2键   VK_RSHIFT A1 161 Shift键
VK_NUMPAD3 63 99 小数字键盘3键   VK_LCONTROL A2 162 Ctrl键
VK_NUMPAD4 64 100 小数字键盘4键   VK_RCONTROL A3 163 右Ctrl键
VK_NUMPAD5 65 101 小数字键盘5键   VK_LMENU A4 164 Alt键
VK_NUMPAD6 66 102 小数字键盘6键   VK_RMENU A5 165 右Alt键

    [例子]:用PageUp键PageDown键和键控制图形。连续按键可得到动画图形。

!!!using("win","math");
f(x,y)= 1.0/[(x-1.0)*(x-1.0)+y*y+1.0];
a(x)=
cwAttach[typeContourLine], cwSetFieldFcn[@f];
b
(x)= cwAttach[typePie], cwAddPie[28.0], cwAddPie[32.0];
c(x:static,k)= cwAttach(), cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,(k++)%10,2,6], 5};
init(x)= cwSetVKFor[VK_PRIOR, @a], cwSetVKFor[VK_NEXT, @b], cwSetVKFor[VK_RIGHT, @c];
ChartWnd[@init];

[返回页首] win::cwSetMouseFor(iMouse, @f):设置鼠标函数,使用户通过鼠标图形显示,返回值无意义。

    iMouse:鼠标消息代码,可取的值为0x0200~0x0209(WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK)。
    f:鼠标消息发生时执行的函数。

    返回值:逻辑值。

    运行错误:1:参数不符合要求。

    [例子]:双击鼠标左键单击鼠标左键和单击鼠标右键控制图形。连续单击鼠标左键可得到动画图形。

!!!using("win","math");
f(x,y)= 1.0/[(x-1.0)*(x-1.0)+y*y+1.0];
a(x)=
cwAttach[typeContourLine], cwSetFieldFcn[@f];
b
(x)= cwAttach[typePie], cwAddPie[28.0], cwAddPie[32.0];
c(x:static,k)= cwAttach(), cwAddCurve{ra1[1,2,3,4,5], ra1[5,3,(k++)%10,2,6], 5};
init(x)= cwSetMouseFor[WM_LBUTTONDBLCLK, @a], cwSetMouseFor[WM_RBUTTONDOWN, @b], cwSetMouseFor[WM_LBUTTONDOWN, @c];
ChartWnd[@init];

[返回页首] luShareX(data):绘制共享X轴视图。data是一个矩阵或者二维数组。

    [例子1]:

!!!using("win","math");
init(x)=
  matrix[
       //用一个矩阵形式的字符串对矩阵进行初始化
"
1 5 100
2 3 300
3 1 600
4 2 200
5 6 500
"
  ].luShareX();
ChartWnd[@init];

    [例子2]:

!!!using("win","math");
init(x)=
  x = matrix[

"
1    2    3    4    5
5    3    1    2    6
100  300  600  200  500
"
  ],
  luShareX(x');
     //求矩阵x的转置
ChartWnd[@init];

    [例子3]:

!!!using("win","math");
f(t,r,f,dr,df,p)={dr=2*r-2*r*f, df=-f+r*f, 0};
//函数定义
init(x) = gsl_ode{@f,nil,0.0,linspace[0.0,10.0,100],ra1[1,3]}.luShareX(); 
//ode方程的解是一个二维数组
ChartWnd[@init];

[返回页首] luShareX2(data1, data2):绘制共享X轴视图。data1和data2是两个矩阵或者二维数组。用于比较data1和data2的差别。

    说明:data1和data2列数可以不相同,但相同的列有相同的坐标轴;data1绘制点图,data2绘制折线图。

    [例子]:

!!!using("win","math");
init(x,y)=
  x=matrix[
"
1 5  100
2 3  300
3 1  600
4 2  200
5 6  500
"
  ],
  y=matrix[
"
1 4.9 110
2 3.0 300
3 1.2 595
4 2.0 210
5 5.9 510
"
  ],
  luShareX2(x, y);
ChartWnd[@init];

[返回页首] luPlot(data):绘制一元函数共享X轴图形。data是一个lu对象。

    说明:luPlot接受一个lu对象,绘制一元函数共享X轴图形,lu对象格式:lu{xMin, xMax, 绘图点数_缺省为1000, @f1, "f1曲线标记(可缺省)", @f2, "f2曲线标记(可缺省)", ... ...}

    [例子]:

!!!using("win");
f(x) = sin[x].*x-x;
       //必须是矢量化代码,简单地:乘号用 .* ;除号用 ./ ;乘方用 .^ ;加号和减号不变,仍然用 + 和 - 。
g(x) = cos[x];
init(x) = luPlot{lu[-9.0,9.0, @f,"函数f", @g,"函数g"]};
ChartWnd[@init];

3 LuWin函数 [返回页首]

[返回页首] win::Plot(Item1,Attribute1,Value1,Attribute2,Value2,...,Item2,Attribute3,Value3,Attribute4,Value4,... ...):动态绘制一元函数及数组图形

    Plot的参数有三种类型:

    (1)以I开头的参数为项目,例如Ix表示要设置X轴的绘图范围,Iufun表示要绘制一元函数图形等等;

    (2)以A开头的参数为项目的属性,例如Acolor表示要设置曲线的颜色;

    (3)以V开头的参数为属性的值,例如Vred表示曲线是红色的。

    所有参数的说明见下表:

I 类型的参数及用法 说  明
win::Iauto 程序退出时自动关闭Plot窗口。这是缺省设置。
win::Ihand 程序退出时手动关闭Plot窗口。
win::Ixdynamic : bDynamic 若bDynamic=true,则X轴绘图区间是动态的。若缺省该参数,相当于bDynamic=false。仅用于iarray、oarray类型的图形。
win::Iydynamic : bDynamic 若bDynamic=true,则Y轴绘图区间是动态的,将自动绘制自变量范围内的函数完整图形。若缺省该参数,相当于bDynamic=true。
win::Ix : Xmin,Xmax 设置X轴绘图区间。
win::Iy : Ymin,Ymax 设置Y轴绘图区间。仅仅进行设置,Y轴绘图区间是否固定,取决于Iydynamic参数。
win::Igarray : hFor,... ...(其他属性设置) 绘制普通数组图形。hFor为三元函数句柄,该函数具有f(x,y,n)的形式:x和y为等长的luData一维数组,n为需要绘制的数组元素个数 (n不能超过数组长度)。
win::Iiarray : hFor,... ...(其他属性设置) 内部计时器控制绘制数组图形。hFor为四元函数句柄,该函数具有f(x,y,n,t)的形式:x和y为等长的luData一维数组,n为需要绘制的数组元素个数(n不能超过数组长度),t返回当前时间。若f(x,y,n,t)返回false,不再定时执行该函数。
win::Ioarray : hFor,... ...(其他属性设置) 外部(计时器)控制绘制数组图形。hFor为四元函数句柄,该函数具有f(x,y,n,t)的形式:x和y为等长的luData一维数组,n为需要绘制的数组元素个数 (n不能超过数组长度),t返回当前时间。
win::Iufun : hFor,... ...(其他属性设置) 可缺省win::Iufun。绘制一元函数图形。hFor为一元函数句柄,该函数具有f(x)的形式。
win::Iifun : hFor,... ...(其他属性设置) 可缺省win::Iifun。绘制一元隐函数图形。hFor为二元函数句柄,该函数具有f(x,y)的形式。可能需要调整绘图点数Adots为合适的数值,才能得到理想的图形。
win::Ipfun : hFor,... ...(其他属性设置) 可缺省win::Ipfun。绘制含参变量的函数图形。hFor为三元函数句柄,该函数具有f(u,x,y)的形式,u为参变量,x返回x(u)的值,y返回y(u)的值 。
win::Itimer : bRun,Ellapse 设置内部计时器。若bRun=true,则启动绘图窗口后立即启动计时器;否则在绘图窗口手动启动计时器。Ellapse为计时间隔(毫秒)。
由于计时器可通过计时器窗口设置,故很少直接使用该函数。
win::Ititle : "标题" 设置图形标题。
win::Ilable : "X轴说明","Y轴说明" 设置X轴及Y轴说明。
win::Igrid : bDraw 是否绘制网格。bDraw为true时绘制。缺省是不绘制。
win::Izoomtype : nType 设置坐标缩放的选项:0-X,1-Y,2-XY。
win::Iaxisshape : Vaxisshape 坐标轴形状。有Vaxisnormal、Vaxissquare、Vaxisequal三种形状。默认是Vaxisnormal。
A 类型的参数及用法 说  明
win::Aline 绘制曲线图。这是缺省设置(Iifun除外)。
win::Adot 绘制散点图。Iifun类型图形的缺省设置。
win::Adots,n 设置绘图点数。仅用于Iufun、Iifun和Ipfun类型的图形。若缺省该参数,对Iufun和Ipfun图形,默认绘制500个点;对Iifun图形,默认绘制100个点。
win::Adotsmax,n 设置绘图点数最大数。仅用于Iifun类型的图形。若缺省该参数,默认最多绘制10000个点。
win::Arange,min,max 设置Iifun和Ipfun类型图形的参数变化范围。Iifun类型函数具有f(x,y)的形式,该参数用于设置y的估计变化范围,允许min==max,若缺省该参数,min和max取Y轴绘图区间(即Iy的设定值);Ipfun类型函数具有f(u,x,y)的形式,该参数用于设置u的变化范围。
win::Aprecision,eps 设置Iifun类型隐函数的求解精度。若缺省该参数,默认求解精度为1e-6。
win::Acolor,Vcolor 设置曲线(点)的颜色。曲线和点颜色的默认值由系统自动确定。
win::Amarker,marker 设置曲线数据点标记是否显示。marker为true时显示。缺省是不显示。
win::Ashape,Vshape 设置曲线(点)的形状。曲线和点形状的默认值由系统自动确定。
win::Alegend,"曲线(点)标记" 设置曲线(点)的标记。将显示为图例。
V 类型的参数及用法 说  明
win::Vsolid 曲线形状为实线。
win::Vdash 曲线形状为虚线。
win::Vdashdot 曲线形状为点线。
win::Vdashdotdot 曲线形状为点划线。
win::Vnull 曲线形状为无。
win::Vinsideframe 曲线形状为实线(边框线)。
win::Vnone 点形状为空。
win::Vcircle 点形状为空心圆。
win::Vsquare 点形状为矩形。
win::Vdiamond 点形状为菱形。
win::Vupt 点形状为上三角。
win::Vdpt 点形状为下三角。
win::Vlpt 点形状为左三角。
win::Vrpt 点形状为右三角。
win::Vfork 点形状为×。
win::Vcross 点形状为+。
win::Vbar 点形状为实心圆点。
win::Vsdot 点形状为实心圆点。
win::Vred 红色。
win::Vyellow 黄色。
win::Vgreen 绿色。
win::Vblue 蓝色。
win::Vgray 灰色。
win::Vblack 黑色。
win::Vaxisnormal 坐标轴正常显示方式。
win::Vaxissquare X轴和Y轴的单位长度相同。
win::Vaxisequal 坐标轴图框呈正方形。

    返回值:0。

    运行错误:1:不可识别的参数类型标识;2:参数不匹配;3:参数不符合要求;4:非法的函数句柄;5:内存错误;6:非法是字符串参数;7:函数的参数个数太多或者太少。

    说明:

    目前Plot函数支持三种函数图形:

    (1)Igarray类型的数组,Iufun、Iifun和Ipfun类型的函数。此类图形仅在通过菜单命令更改设置时更新数据(例如改变了X轴的最小值),内部计时器及外部控制对此毫无影响。

    (2)Iiarray类型的数组。此类图形的更新仅受内部计时器的控制。

    (3)Ioarray类型的数组。此类图形的更新仅受外部(计时器)的控制。

    Plot函数的运行机制如下图所示:

    Plot函数的基础用法:

    (1)Plot函数的简单用法

f(x)=sin[10*x];     //一元函数
g(x)=x*sin[10*x];
   //一元函数
win::Plot[@f, @g];
 //绘制函数f和g的图形

    这种用法非常简单, 部分属性已经自动设置了,例如曲线的颜色;其余属性可通过菜单进行设置,例如:X轴的范围(X轴范围更改后,还要执行右键菜单“按新设定的坐标轴重绘”)。

    以下例子是通过脚本设置图形属性的。

    (2)Ix选项

!!!using("win");    //使用命名空间win
f(x)=sin[10*x];
     //一元函数
g(x)=x*sin[10*x];
   //一元函数
Plot[Ix : -5.,5., @f, @g];
//绘制函数f和g的图形,Ix指出X轴绘图范围

    (3)隐函数图形

!!!using("win");
f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;
  //二元函数确定了一个隐函数
Plot[Ix : -8.,8., Igrid : true,     //Igrid指出是否绘制网格
     @f, Arange,-8.,8., Adots,200];
//Arange指出Y的可能的变化范围,通常不能省略该参数;Adot指出绘图点数,绘图点数越多越准确

    友情提示:隐函数绘制时,调整Arange的范围大小有助于获得更准确的图形。

    (5)绘制含参变量的函数

!!!using("win");
f(u,x,y)= x=u*sin[u],y=u*cos[u]^2;
    //三元函数确定了一个含参变量的函数,第一个参数u是参变量,x和y的返回值确定了一个点
Plot[Ix : -9.,9
., @f, Arange,-9.,9.];
//Arange指出参变量u的变化范围

    Plot函数的例子:

    [例子1] 一元函数图形绘制

!!!using("win");        //使用命名空间win
f(x)=sin[x];
            //函数定义
g(x)=x*sin[x];
          //函数定义
Plot{
Ix : -5.,5.,       //设置X轴绘图范围
     Iufun : @f,
        //绘制函数f的图形
     Iufun : @g,Adot,Adots,100
//绘制函数g的图形,将绘制散点图,绘制100个点
};

    本例近乎等效的矢量化代码如下:

!!!using("win","math");
(::x,y1,y2,max)= max=100, x=linspace(-5.,5.,max), y1=sin(x), y2=x.*sin(x);
f(xx,yy,n::x,y1,max)= xx=x,yy=y1,n=max;
g(xx,yy,n::x,y2,max)= xx=x,yy=y2,n=max;
Plot{
Ix : -5., 5.,
     Igarray : @f,
     //绘制普通数组图形,绘制为曲线图
     Igarray : @g,Adot
//绘制普通数组图形,绘制为散点图
};

    本例近乎等效的隐函数图形绘制代码为:

!!!using("win");
f(x,y)=sin[x]-y;
       //隐函数定义
g(x,y)=x*sin[x]-y;
     //隐函数定义
Plot{
Ix : -10.,10.,
     Iifun : @f,
     Iifun : @g
};

    图形如下所示:

    在Plot窗口,可以双击或右单击打开“曲线设置”窗口,设置曲线属性。

    [例子2] 一元函数图形绘制并显示标题、坐标轴、图例和标记

!!!using("win");
f(x)=sin[x];
g(x)=x*sin[x];
Plot{
Ix : -5.,5.,
     Iufun : @f, Alegend,"sin[x]",  Amarker,true, Acolor,Vblue,
        //绘制函数f的图形并显示图例和标记
     Iufun : @g, Alegend,"x*sin[x]",Amarker,true, Acolor,RGB(0,255,0),
//绘制函数g的图形并显示图例和标记
     Ititle : "Plot演示程序",
           //显示标题
     Ilable : "t /","V /m^3"
         //显示坐标轴说明
};

    图形如下所示:

    在Plot窗口,可以双击或右单击打开“曲线设置”窗口,设置曲线属性。

    [例子3] 一元函数及含参变量函数图形绘制

!!!using("win");
f(x)=sin[x];
g(u,x,y)= x=u*sin[u],y=u*cos[u]^2;
Plot{
Ix : -9.,9.,
     Iufun : @f,Acolor,Vred,
  //绘制函数f的图形,颜色是红色的
     Ipfun : @g,Arange,-9.,9
. //绘制函数g的图形,参变量的变化范围是 -9~9
};

    图形如下所示:

    [例子4] 通过参数控制函数图形

!!!using("win");
init(::A,B,C)= A=2.,B=1.,C=0.;
    //初始化模块变量
A(m,x::A)= which{m==0:A, m==1:[A=A+x], m==2:[A=A-x], m==3:[A=x], PlotExe(0)};
 //修改模块变量A并刷新Plot窗口的函数
B(m,x::B)= which{m==0:B, m==1:[B=B+x], m==2:[B=B-x], m==3:[B=x], PlotExe(0)};
 //修改模块变量B并刷新Plot窗口的函数
C(m,x::C)= which{m==0:C, m==1:[C=C+x], m==2:[C=C-x], m==3:[C=x], PlotExe(0)};
 //修改模块变量C并刷新Plot窗口的函数
f(x::A,B,C)=A*sin[B*x+C];
g(u,x,y::A,B)= x=u*sin[u+A],y=u*cos[u*B]^2;
Plot{
Ix : -5.,5.,
     Iufun : @f,Acolor,Vred,
     Ipfun : @g,Arange,-3.,3.
},

SetPara{GetWin(hPlot),
//获得Plot函数的窗口句柄。可以缺省该参数获得另一效果。
        @A,0.5,
        //使参数A可动态修改
        @B,0.5,
        //使参数B可动态修改
        @C,0.5
        //使参数C可动态修改
};

    图形如下所示(其动态效果需通过参数控制演示):

    [例子5] 普通数组图形绘制

!!!using("win","math");
init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
             B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
f(x,y,n::A,B)= x=A,y=B,n=15;
ff(x,y,n)= f(&x,&y,&n);
g(x,y,n::A,B)= x=B,y=A,n=15;
Plot{
Ix : -12.,12.,
     Igarray : @f,
       //绘制数组为曲线
     Igarray : @ff,Adot,
//绘制数组为散点图
     Igarray : @g,Ashape,Vdash,Acolor,Vred
//绘制数组为曲线
};

    图形如下所示:

    [例子6] 内部计时器控制的数组图形绘制

!!!using("win","math");
init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
             B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
f(x,y,n,t:static,i:A,B)= x=A,y=B,n=++i%20,if[i>50,return(false)],true;
   //函数f只运行50次
ff(x,y,n,t)= f(&x,&y,&n,&t);
g(x,y,n,t:static,i:A,B)= x=B,y=A,n=++i%20,true;
Plot{
Ix : -12.,12.,
     Iiarray : @f,
     Iiarray : @ff,Adot,
     Iiarray : @g,Ashape,Vdash,Acolor,Vred

};

    图形如下所示(其动态效果需通过内部计时器控制演示 :在Plot窗口,打开“计时器设置”窗口,点击开始按钮,观察动态图形):

    [例子7] 外部(计时器)控制的数组图形绘制,横轴固定不变

!!!using("win","math");
init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
             B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
f(x,y,n,t:static,i:A,B)= x=A,y=B,n=++i%20;
ff(x,y,n,t)= f(&x,&y,&n,&t);
g(x,y,n,t:static,i:A,B)= x=B,y=A,n=++i%20;
Plot{
Ix : -12.,12.,
     Iiarray : @f,

     Iiarray : @ff,Adot,
     Iiarray : @g,Ashape,Vdash,Acolor,Vred
};
~~~:::a(:static,k) = PlotExe[],if[++k>=50,return(false)],true;  //全局函数a只运行50次
~~~:::b() = PlotExe[],true;
FunTimer[];
  //启动定时器

    图形如下所示(其动态效果需通过外部计时器控制演示):

    在FunTimer窗口,在计时器1的全局函数名输入窗口输入“a”,点击开始按钮,观察动态图形,直至图形自动停止更新;在计时器2的全局函数名输入窗口输入“b”,点击开始按钮,观察动态图形,该动态图形不会自动停止。

    [例子8] 外部(计时器)控制的数组图形绘制,横轴动态更新

!!!using("win","math");
init(::A,B)= A=ra1[-9.5, -9, -7, -6.5, -5, -3, -2, -1.2, 0, 1.5, 2, 3, 5, 6, 7.7, 8, 8.2, 8.6, 9, 10],
             B=ra1[5, -9, 7, 6.5, -5, -3, 12, 1.2, 0, 11.5, -9, -3, 5, -6, 7.7, -8, 5.2, -8.6, -9, 7];
f(x,y,n,t:static,i:A,B)= x=A,y=B,n=++i%20;
ff(x,y,n,t)= f(&x,&y,&n,&t);
Plot{
Ixdynamic : true,     //X轴是动态的
     Ioarray : @f,
     Ioarray : @ff,Adot,Acolor,Vred
};
~~~:::a(:static,k) = PlotExe[],if[++k>=50,return(false)],true;
~~~:::b() = PlotExe[],true;
FunTimer[];

    图形如下所示(其动态效果需通过外部计时器控制演示):

    在FunTimer窗口,在计时器1的全局函数名输入窗口输入“a”,点击开始按钮,观察动态图形,直至图形自动停止更新;在计时器2的全局函数名输入窗口输入“b”,点击开始按钮,观察动态图形,该动态图形不会自动停止。

    [例子9] 内部计时器控制演示动态图形

!!!using("win","math");
init(::A,B,max)= max=500, A=new[real_s, max], B=new[real_s, max];
f(x,y,n,t:i,u,d,static,k:A,B,max)=
{
    x=A,y=B,n=++k%(max+1), t=0.,
    u=-9.,d=18./max,i=0,(i<n).while{
        x[i]=u*sin[u], y[i]=u*cos[u]^2,
        u=u+d, i++
    },
    true
};
Plot{Ixdynamic : true,
     Iiarray : @f,Adot,Ashape,Vdiamond,Acolor,Vred,
     Itimer : true, 100
};

    图形如下所示(直接运行程序即可动态演示):

    [例子10] 内部计时器控制演示动态图形:旋轮线动画

!!!using("win","math");
init(::A,B,C,D,max)= max=200, A=new[real_s, max+1], B=new[real_s, max+1], C=new[real_s, max], D=new[real_s, max];
f(x,y,n,t:i,u,d,static,k:A,B,max)=
{
    x=A,y=B,n=[++k%(max+1)], t=0.,
    u=0.,d=15./(max-1),i=0,(i<n).while{
        x[i]=[u-sin(u)], y[i]=[1-cos(u)],
        u=u+d, i++
    },
    x[i]=u, y[i]=1., n++,
    true
};
g(x,y,n,t:i,u,d,static,k,v:C,D,max)=
{
    x=C, y=D, n=max, t=0.,
    if[1==[++k%(max+1)], v=0.],
    u=0.,d=2*3.1416/(max-1),i=0,(i<n).while{
        x[i]=v+cos(u), y[i]=1+sin(u),
        u=u+d, i++
    },
    v=v+15./(max-1), true
};
Plot{Ix : 0.,15., Iy : 0.,2., Iydynamic : false, Iaxisshape : Vaxisequal,
     Iiarray : @f,Acolor,Vred,
     Iiarray : @g,Acolor,Vblue,
     Itimer : true, 100
};

    图形如下所示:

    [例子11] 隐函数图形(x取1.5~10,y取2附近):f(x,y)=ln(3.5*x^y)+x-y^x-(sin(y-x))^2+0.6-(x+y)^(0.1*x)/x;

!!!using("win");
f(x,y)=ln(3.5*x^y)+x-y^x-(sin(y-x))^2+0.6-(x+y)^(0.1*x)/x;
Plot{
Ix : 1.5,8.,
     Iifun : @f,Arange,2.,2. 
//y取2附近
};

    图形如下所示:

    [例子12] 隐函数图形(x取-8~8,y取-8~8附近):f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;

!!!using("win");
f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;
Plot{
Ix : -8.,8., Iaxisshape : Vaxissquare,
     Iifun : @f,Arange,-8.,8.
//y取-8~8
};

    图形如下所示:

    [例子13] 隐函数图形(x取-5~5,y取-5~5附近):f(x,y)=cos(x*y);

!!!using("win");
f(x,y)=cos(x*y);
Plot{Ix : -5.,5., Iy : -5.,5., Iydynamic : false, Igrid : true,
     Iifun : @f, Acolor,Vblue, Adots,300
};

    图形如下所示:

[返回页首] win::PlotExe()或win::PlotExe(x):向Plot发送执行函数命令并刷新图形

    说明:win::PlotExe()用于执行用win::Ioarray注册到Plot的绘图函数 ;win::PlotExe(x)用于执行用注册到Plot的非计时器绘图函数(包括win::Igarray、win::Iufun、win::Iifun、win::Ipfun),x为任意值。可在任意线程中通过该函数控制Plot中图形的刷新。

    [例子]

[返回页首] win::FunTimer():使用计时器定时执行函数

    返回值:0。

    说明:最多设置三个同时运行的计时器,每个计时器定时执行一个对应的全局函数。若全局函数返回false,将销毁对应的计时器,该全局函数也不再执行。

    计时器窗口启动后,可以打开计时器设置窗口,如下所示:

    [例子1] 先编译运行以下代码,然后按上面的计时器窗口进行设置,点击按钮,观察运行情况。

~~~:::a() = o{"执行函数a!\r\n"},true;  //必须定义为全局函数,前面的~~~表示只编译,不运行
~~~:::b() = o{"执行函数b!\r\n"},true;
~~~:::c() = o{"执行函数c!\r\n"},true;
win::FunTimer[];
                       //启动定时器窗口

    [例子2] 由全局函数自身控制运行次数。

~~~:::a(:static,k) = o{"执行函数a!\r\n"},if[++k>=5,return(false)],true;  //全局函数a只运行5次
~~~:::b() = o{"执行函数b!\r\n"},true;
~~~:::c() = o{"执行函数c!\r\n"},true;
win::FunTimer[];

[返回页首] win::SetPara(hWin,hFor1,dx1,hFor2,dx2,... ...):设置可通过参数修改窗口修改的参数

    hWin:父窗口句柄。可以缺省该参数。
    hFor1,dx1,hFor2,dx2,... ...:hFor为二元函数句柄,该函数由SetPara的参数修改窗口调用,具有以下格式:

修改x(mode,dx::x)=  //mode为工作模式,整数;dx为增量,实数;x是一个模块变量
{
    if{mode==0, return(x)},
          //mode为0,返回x当前值;SetPara初始化时,会使用mode=0获得x的初值
    if{mode==1, x=x+dx, return(x)},
  //mode为1,使x增加dx并返回x当前值
    if{mode==2, x=x-dx, return(x)},
  //mode为2,使x减少dx并返回x当前值
    if{mode==3, x=dx,   return(x)},
  //mode为3,重置x为初值,返回值被忽略
    if{mode<0, ... 用户定义操作 ...]
  //mode小于0时,执行用户定义的操作
};

    该函数的作用是通过增量dx修改模块变量x,并执行某些操作。SetPara初始化时,将先调用 修改x(0,任意值) 以获得模块变量x的初值xx。SetPara的参数修改窗口有三个按钮:增加、减少、重置。

    【增加】:先执行修改x(1,dx),然后执行修改x(-1,任意值)
    【减少】:先执行
修改x(2,dx),然后执行修改x(-1,任意值)
    【重置】:先执行
修改x(3,xx),然后执行修改x(-1,任意值)

    运行错误:1:参数不匹配,函数参数个数太多或者太少;2:找不到全局函数,或者该函数不是二元函数,或者函数返回值不是一个实数;3:内存错误;4:参数不符合要求。

    [例子]

[返回页首] win::MessageBox("消息框中显示的字符串","作为标题的字符串"):消息框函数

    格式1:MessageBox["消息框中显示的字符串","作为标题的字符串"]
    格式2:MessageBox["消息框中显示的字符串","作为标题的字符串",nType]
    格式3:MessageBox[HWND,"消息框中显示的字符串","作为标题的字符串",nType]

    说明:HWND标识将被创建的消息框的拥有窗口,如果此参数为null,则消息框没有拥有窗口;nType指定一个决定对话框的内容和行为的位标志集,此参数可以为下列标志组中标志的组合(尚未定义这些参数):MB_OK、MB_OKCANCEL、MB_YESNO、MB_YESNOCANCEL,其他标志请参考WINDOWS API手册中该函数的说明。

    返回值:如果没有足够的内存来创建消息框,则返回值为0。如果函数调用成功,则返回值为下列对话框返回的菜单项目值中的一个(尚未定义这些参数):
    IDABORT:Abort按钮被选中。
    IDCANCEL:Cancel按钮被选中。
    IDIGNORE:Ignore按钮被选中。
    IDNO:NO按钮被选中。
    IDOK:OK按钮被选中。
    IDRETRY:RETRY按钮被选中。
    IDYES:YES按钮被选中。
    标志和返回值的具体值请参考WINDOWS API手册,也可以自行验证。

    运行错误:1:参数个数不符合要求;2:参数不符合要求。


版权所有© Lu程序设计 2002-2021,保留所有权利
E-mail: forcal@sina.com
  QQ:630715621
最近更新: 2021年07月30日