欢迎访问 Forcal程序设计

FORCAL图形库FC2D

目 录

1 什么是FC2D
2 FC2D函数
fc2d::FunTimer | 使用计时器定时执行函数
fc2d::Plot | 动态绘制一元函数及数组图形
fc2d::PlotExe | 向Plot发送执行函数命令并刷新图形
fc2d::RGB(r,g,b) | 定义绘图颜色。r,g,b分别表示红色值、绿色值和蓝色值。r,g,b取值范围均为0～255。
3 通过GForcal调用FC2D
3.1 C/C++例子 | C/C++、GForcal混合编程调用FC2D库，绘制2D图形。可用于数据的自动化采集及动态图形显示。
3.2 C#例子 | C＃、GForcal混合编程调用FC2D库，绘制2D图形。可用于数据的自动化采集及动态图形显示。 感谢刘圆圆先生（mgenx@live.com）为该例子编写了C#代码，下载：http://www.forcal.net/xiazai/forcal9/forcal9code.rar

1 什么是FC2D [返回页首]

FC2D32W.dll是一个Forcal扩展动态库，主要包含一些绘制2D图形的函数。多线程动态绘制图形是FC2D的基本特点。

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

FC2D32W.dll需要MForcal32W.dll和FcData32W.dll的支持，MForcal32W.dll和FcData32W.dll要先于FC2D32W.dll加载。

3 FC2D函数 [返回页首]

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

bAutoClose：若bAutoClose=fc2d::auto，程序退出时将自动关闭窗口；若bAutoClose=fc2d::hand，程序退出时需手动关闭窗口。可以缺省该参数，相当于bAutoClose=fc2d::auto。
返回值：0。

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

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

[例子1] 先编译运行以下代码，然后按上面的计时器窗口进行设置，点击按钮，观察运行情况，注意运行结果在哪里输出。

> ~:a() = printff{"执行函数a！\r\n"},1; //必须定义为全局函数，前面的冒号表示只编译，不运行
> ~:b() = printff{"执行函数b！\r\n"},1;
> ~:c() = printff{"执行函数c！\r\n"},1;
> fc2d::FunTimer[]; //启动定时器窗口

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

> ~:a(:static,k) = printff{"执行函数a！\r\n"},if[++k>=5,return(0)],1; //全局函数a只运行5次
> ~:b() = printff{"执行函数b！\r\n"},1;
> ~:c() = printff{"执行函数c！\r\n"},1;
> fc2d::FunTimer[];

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

Plot的参数有三种类型：

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

（2）以A开头的参数为项目的属性，例如Acolor表示要设置曲线的颜色；

（3）以V开头的参数为属性的值，例如Vred表示曲线是红色的。

所有参数的说明见下表：

I 类型的参数及用法 | 说 明
fc2d::Iclear | 初始化绘图设置。仅在需要时使用该参数。若缺省该参数，将保留以前的设置。如果使用该参数，该参数应放在最前面。
fc2d::Iauto | 程序退出时自动关闭Plot窗口。这是缺省设置。
fc2d::Ihand | 程序退出时手动关闭Plot窗口。
fc2d::Inoshow | 仅进行一些设置，不启动Plot窗口。若缺省该参数，Plot函数将启动Plot窗口。
fc2d::Ixdynamic : bDynamic | 若bDynamic非0，则X轴绘图区间是动态的。若缺省该参数，相当于bDynamic=0。仅用于iarray、oarray类型的图形。
fc2d::Iydynamic : bDynamic | 若bDynamic非0，则Y轴绘图区间是动态的，将自动绘制自变量范围内的函数完整图形。若缺省该参数，相当于bDynamic非0。
fc2d::Ix : Xmin,Xmax | 设置X轴绘图区间。
fc2d::Iy : Ymin,Ymax | 设置Y轴绘图区间。仅仅进行设置，Y轴绘图区间是否固定，取决于Iydynamic参数。
fc2d::Igarray : hFor,... ...（其他属性设置） | 绘制普通数组图形。hFor为三元函数句柄，该函数具有f(x,y,n)的形式：x和y为等长的FcData一维数组，n为需要绘制的数组元素个数 （n不能超过数组长度）。
fc2d::Iiarray : hFor,... ...（其他属性设置） | 内部计时器控制绘制数组图形。hFor为三元函数句柄，该函数具有f(x,y,n,t)的形式：x和y为等长的FcData一维数组，n为需要绘制的数组元素个数（n不能超过数组长度），t返回当前时间。若f(x,y,n,t)返回0，不再定时执行该函数。
fc2d::Ioarray : hFor,... ...（其他属性设置） | 外部（计时器）控制绘制数组图形。hFor为三元函数句柄，该函数具有f(x,y,n,t)的形式：x和y为等长的FcData一维数组，n为需要绘制的数组元素个数 （n不能超过数组长度），t返回当前时间。
fc2d::Iufun : hFor,... ...（其他属性设置） | 绘制一元函数图形。hFor为一元函数句柄，该函数具有f(x)的形式。
fc2d::Iifun : hFor,... ...（其他属性设置） | 绘制一元隐函数图形。hFor为二元函数句柄，该函数具有f(x,y)的形式。可能需要调整绘图点数Adots为合适的数值，才能得到理想的图形。
fc2d::Ipfun : hFor,... ...（其他属性设置） | 绘制含参变量的函数图形。hFor为三元函数句柄，该函数具有f(u,x,y)的形式，u为参变量，x返回x(u)的值，y返回y(u)的值 。
fc2d::Itimer : bRun,Ellapse | 设置内部计时器。若bRun非0，则启动绘图窗口后立即启动计时器；否则在绘图窗口手动启动计时器。Ellapse为计时间隔（毫秒）。 由于计时器可通过计时器窗口设置，故很少直接使用该函数。
fc2d::Isetpara : hFor,dx | 设置可通过参数修改窗口修改的参数。hFor为一元函数句柄，该函数具有x(dx::x)= x=x+dx,x;的形式：通过增量dx修改模块变量x，并返回x的值。为了便于区分参数，通常使函数x和模块变量x具有相同的名字。
fc2d::Ititle : "标题" | 设置图形标题。
fc2d::Ilable : "X轴说明","Y轴说明" | 设置X轴及Y轴说明。
fc2d::Igrid : bDraw | 是否绘制网格。bDraw非0时绘制。缺省是不绘制。
fc2d::Iaxisratio : xRatio,yRatio | 坐标轴比率。显示坐标轴数字时所乘的系数。缺省是1。
fc2d::Iaxisnums : num | 坐标轴数字个数。缺省是10。
fc2d::Iaxisdigits : num | 坐标轴数字个数。缺省是3。
fc2d::Iborderpixels : num | 边沿像素数目。缺省是30。
fc2d::Iaxisshape : Vaxisshape | 坐标轴形状。有Vaxisnormal、Vaxissquare、Vaxisequal三种形状。默认是Vaxisnormal。
A 类型的参数及用法 | 说 明
fc2d::Aline | 绘制曲线图。这是缺省设置（Iifun除外）。
fc2d::Adot | 绘制散点图。Iifun类型图形的缺省设置。
fc2d::Acut,bcut | 设置是否将绘图区域以外的点绘制到边界上。若bcut非0，不绘制到边界；否则绘制到边界。若缺省该参数，相当于bcut非0。
fc2d::Adots,n | 设置绘图点数。仅用于Iufun、Iifun和Ipfun类型的图形。若缺省该参数，对Iufun和Ipfun图形，默认绘制500个点；对Iifun图形，默认绘制100个点。
fc2d::Adotsmax,n | 设置绘图点数最大数。仅用于Iifun类型的图形。若缺省该参数，默认最多绘制10000个点。
fc2d::Arange,min,max | 设置Iifun和Ipfun类型图形的参数变化范围。Iifun类型函数具有f(x,y)的形式，该参数用于设置y的估计变化范围，允许min==max，若缺省该参数，min和max取Y轴绘图区间（即Iy的设定值）；Ipfun类型函数具有f(u,x,y)的形式，该参数用于设置u的变化范围。
fc2d::Aprecision,eps | 设置Iifun类型隐函数的求解精度。若缺省该参数，默认求解精度为1e-6。
fc2d::Acolor,Vcolor | 设置曲线（点）的颜色。曲线的默认值为黑色；点的默认值为黑色。
fc2d::Athick,Vthick | 设置曲线粗细或点的大小。曲线的默认值为0；点的默认值为5。
fc2d::Ashape,Vshape | 设置曲线（点）的形状。曲线的默认值为实线；点的默认值为实心点。
fc2d::Alegend,"曲线（点）标记" | 设置曲线（点）的标记。将显示为图例。相同的标记仅显示一次，但图例重叠。
V 类型的参数及用法 | 说 明
fc2d::Vsolid | 曲线形状为实线。
fc2d::Vdash | 曲线形状为虚线。
fc2d::Vdashdot | 曲线形状为点线。
fc2d::Vdashdotdot | 曲线形状为点划线。
fc2d::Vnull | 曲线形状为无。
fc2d::Vinsideframe | 曲线形状为实线（边框线）。
fc2d::Vsdot | 点形状为实心圆点。
fc2d::Vcircle | 点形状为空心圆。
fc2d::Vfork | 点形状为×。
fc2d::Vcross | 点形状为＋。
fc2d::Vpozi | 点形状为米字。
fc2d::Vsquare | 点形状为矩形。
fc2d::Vdiamond | 点形状为菱形。
fc2d::Vupt | 点形状为上三角。
fc2d::Vdpt | 点形状为下三角。
fc2d::Vlpt | 点形状为左三角。
fc2d::Vrpt | 点形状为右三角。
fc2d::Vpentagram | 点形状为五角星。
fc2d::Vhexagram | 点形状为六角星。
fc2d::Vred | 红色。
fc2d::Vyellow | 黄色。
fc2d::Vgreen | 绿色。
fc2d::Vblue | 蓝色。
fc2d::Vgray | 灰色。
fc2d::Vblack | 黑色。
fc2d::Vaxisnormal | 坐标轴正常显示方式。
fc2d::Vaxissquare | X轴和Y轴的单位长度相同。
fc2d::Vaxisequal | 坐标轴图框呈正方形。
Plot函数其他用法 | 说 明
fc2d::Plot[] | 启动绘图窗口，程序退出时将自动关闭该窗口。在进行所有设置（使用Inoshow参数）后，才能调用该函数。

返回值：0。

运行错误：1：不可识别的参数类型标识；2：参数不匹配；3：参数不符合要求；4：非法的函数句柄；5：内存错误。

说明：

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

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

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

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

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

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

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

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

> !using("fc2d","math");
> (::x,y1,y2,max)= max=100, oo{x=linspace(minus(5),5,max), y1=Sin(x), y2=x*Sin(x), x.to().free(), y1.to().free(), y2.to().free()};
> 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 : HFor("f"), //绘制普通数组图形，绘制为曲线图
> Igarray : HFor("g"),Adot //绘制普通数组图形，绘制为散点图
> };

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

> !using("fc2d");
> f(x,y)=sin[x]-y; //隐函数定义
> g(x,y)=x*sin[x]-y; //隐函数定义
> Plot{Ix : -5,5,
> Iifun : HFor("f"),
> Iifun : HFor("g")
> };

图形如下所示：

在Plot窗口，打开“曲线设置”窗口，设置曲线属性；打开“参数设置”窗口，设置X轴及Y轴变化范围；打开“选择数据”窗口，选择若干数据（也可在绘图区域双击鼠标左键选择数据）。

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

> !using("fc2d");
> f(x)=sin[x];
> ff(x)=f[x];
> g(x)=x*sin[x];
> gg(x)=g[x];
> Plot{Ix : -5,5,
> Iufun : HFor("f"), Alegend,"sin[x]",Acolor,Vgreen, //绘制函数f的图形 并显示图例
> Iufun : HFor("ff"),Alegend,"sin[x]",Acolor,Vred,Adot,Adots,100, //绘制函数ff的图形并显示图例，将绘制散点图，绘制100个点
> Iufun : HFor("g"), Alegend,"x*sin[x]",Acolor,RGB(0,255,0), //绘制函数g的图形 并显示图例
> Iufun : HFor("gg"),Alegend,"x*sin[x]",Acolor,Vblue,Adot,Adots,100, //绘制函数gg的图形并显示图例，将绘制散点图，绘制100个点
> Ititle : "Plot演示程序", //显示标题
> Ilable : "t /℃","V /m^3" //显示坐标轴说明
> };

图形如下所示：

在Plot窗口，打开“曲线设置”窗口，设置曲线属性；打开“参数设置”窗口，设置X轴及Y轴变化范围；打开“选择数据”窗口，选择若干数据（也可在绘图区域双击鼠标左键选择数据）。

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

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

图形如下所示：

在Plot窗口，打开“曲线设置”窗口，设置曲线属性；打开“参数设置”窗口，设置X轴变化范围；打开“选择数据”窗口，选择若干数据（也可在绘图区域双击鼠标左键选择数据）。

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

> !using("fc2d");
> init(::A,B,C)= A=2,B=1,C=0; //初始化模块变量
> A(x::A)= A=A+x; //修改模块变量A的函数
> B(x::B)= B=B+x; //修改模块变量B的函数
> C(x::C)= C=C+x; //修改模块变量C的函数
> 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 : HFor("f"),Acolor,Vred,
> Ipfun : HFor("g"),Arange,-3,3,
> Isetpara : HFor("A"),0.5,//使参数A可动态修改
> Isetpara : HFor("B"),0.5,//使参数B可动态修改
> Isetpara : HFor("C"),0.5 //使参数C可动态修改
> };

图形如下所示（其动态效果需通过参数控制演示）：

在Plot窗口，打开“曲线设置”窗口，设置曲线属性；打开“参数设置”窗口，设置X轴变化范围；打开“选择数据”窗口，选择若干数据（也可在绘图区域双击鼠标左键选择数据）。

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

> !using("fc2d","math");
> init(::A,B)= A=arrayinit[1 : 20 : -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].free(),
> B=arrayinit[1 : 20 : 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].free();
> 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 : HFor("f"), //绘制数组为曲线
> Igarray : HFor("ff"),Adot, //绘制数组为散点图
> Igarray : HFor("g"),Ashape,Vdash,Acolor,Vred //绘制数组为曲线
> };

图形如下所示：

在Plot窗口，打开“曲线设置”窗口，设置曲线属性；打开“参数设置”窗口，设置X轴变化范围；打开“选择数据”窗口，选择若干数据（也可在绘图区域双击鼠标左键选择数据）。

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

> !using("fc2d","math");
> init(::A,B)= A=arrayinit[1 : 20 : -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].free(),
> B=arrayinit[1 : 20 : 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].free();
> f(x,y,n,t:static,i:A,B)= x=A,y=B,n=fmod(++i,20),if[i>50,return(0)],1; //函数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=fmod(++i,20),1;
> Plot{Ix : -12,12,
> Iiarray : HFor("f"),
> Iiarray : HFor("ff"),Adot,
> Iiarray : HFor("g"),Ashape,Vdash,Acolor,Vred
> };

图形如下所示（其动态效果需通过内部计时器控制演示）：

在Plot窗口，打开“曲线设置”窗口，设置曲线属性（曲线粗细和颜色）；打开“计时器设置”窗口，点击开始按钮，观察动态图形。

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

> !using("fc2d","math");
> init(::A,B)= A=arrayinit[1 : 20 : -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].free(),
> B=arrayinit[1 : 20 : 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].free();
> f(x,y,n,t:static,i:A,B)= x=A,y=B,n=fmod(++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=fmod(++i,20);
> Plot{Ix : -12,12,
> Iiarray : HFor("f"),
> Iiarray : HFor("ff"),Adot,
> Iiarray : HFor("g"),Ashape,Vdash,Acolor,Vred
> };
> ~:a(:static,k) = PlotExe[],if[++k>=50,return(0)],1; //全局函数a只运行50次
> ~:b() = PlotExe[],1;
> FunTimer[]; //启动定时器

图形如下所示（其动态效果需通过外部计时器控制演示）：

在Plot窗口，打开“曲线设置”窗口，设置曲线属性（曲线粗细和颜色）；在 FunTimer 窗口，打开“计时器设置”窗口， 在计时器1的全局函数名输入窗口输入“a”，点击开始按钮，观察动态图形，直至图形自动停止更新；在计时器2的全局函数名输入窗口输入“b”，点击开始按钮，观察动态图形，该动态图形不会自动停止。

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

> !using("fc2d","math");
> init(::A,B)= A=arrayinit[1 : 20 : -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].free(),
> B=arrayinit[1 : 20 : 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].free();
> f(x,y,n,t:static,i:A,B)= x=A,y=B,n=fmod(++i,20);
> ff(x,y,n,t)= f(&x,&y,&n,&t);
> Plot{Ixdynamic : 1, //X轴是动态的
> Ioarray : HFor("f"),
> Ioarray : HFor("ff"),Adot,Acolor,Vred
> };
> ~:a(:static,k) = PlotExe[],if[++k>=50,return(0)],1;
> ~:b() = PlotExe[],1;
> FunTimer[];

图形如下所示（其动态效果需通过外部计时器控制演示）：

在Plot窗口，打开“曲线设置”窗口，设置曲线属性（曲线粗细和颜色）；在 FunTimer 窗口，打开“计时器设置”窗口， 在计时器1的全局函数名输入窗口输入“a”，点击开始按钮，观察动态图形，直至图形自动停止更新；在计时器2的全局函数名输入窗口输入“b”，点击开始按钮，观察动态图形，该动态图形不会自动停止。

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

> !using("fc2d","math");
> init(::A,B,max)= max=500, A=array[max].free(), B=array[max].free();
> f(x,y,n,t:i,u,d,static,k:A,B,max)=
> {
> x=A,y=B,n=fmod(++k,max+1),
> 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++
> },
> 1
> };
> Plot{Iclear, Ixdynamic : 1, Itimer : 1, 100,
> Iiarray : HFor("f"),Adot,Ashape,Vdiamond,Acolor,Vred
> };

图形如下所示（直接运行程序即可动态演示）：

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

> !using("fc2d","math");
> init(::A,B,C,D,max)= max=200, A=array[max+1].free(), B=array[max+1].free(), C=array[max].free(), D=array[max].free();
> f(x,y,n,t:i,u,d,static,k:A,B,max)=
> {
> x=A,y=B,n=fmod(++k,max+1),
> 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++,
> 1
> };
> g(x,y,n,t:i,u,d,static,k,v:C,D,max)=
> {
> x=C, y=D, n=max, if[1==fmod(++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), 1
> };
> Plot{Iclear, Ix : 0,15, Iy : 0,2, Iydynamic : 0, Itimer : 1, 100, Iaxisshape : Vaxisequal,
> Iiarray : HFor("f"),Acolor,Vred,
> Iiarray : HFor("g"),Acolor,Vblue
> };

图形如下所示：

[例子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("fc2d");
> 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 : HFor("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("fc2d");
> f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;
> Plot{Ix : -8,8, Iaxisshape : Vaxissquare,
> Iifun : HFor("f"),Arange,-8,8 //y取-8～8
> };

图形如下所示：

[例子13] 隐函数图形（x取-5～5，y取-5～5附近）：f(x,y)=cos(x*y);

> !using("fc2d");
> f(x,y)=cos(x*y);
> Plot{Iclear, Ix : -5,5, Iy : -5,5, Iydynamic : 0, Igrid : 1,
> Iifun : HFor("f"), Acolor,Vblue, Adots,300
> };

图形如下所示：

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

说明：该函数用于执行用fc2d::Ioarray注册到Plot的绘图函数，可在任意线程中通过该函数控制Plot中图形的刷新。

3 通过GForcal调用FC2D [返回页首]

3.1 C/C++例子

该例子中，C/C++程序每隔1秒向FC2D的Plot函数发送一组数据，Plot将动态显示这些数据。

所需的Forcal代码如下：

> !using("fc2d","math");
> init(::now,max,A,B)= now=0, max=30, A=array[max].free(), B=array[max].free(); //初始化
> ~GetMax(::max)=max; //由C++程序调用，返回总的数据组数
> ~SetXY(x,y::now,A,B)= A[now]=x, B[now++]=y, PlotExe[]; //由C++程序调用，设置一组数据，并发出刷新命令
> f(x,y,n,t::now,A,B)= x=A,y=B,n=now;
> Plot{Ixdynamic : 1,
> Ioarray : HFor("f"),Acolor,Vred
> };

C++代码如下：

#include <windows.h>
#include <iostream>
#include <math.h>
#include "forcal32w.h"
#include "gforcal32w.h"
#pragma comment( lib, "GForcal32W.lib" )
using namespace std;
void main(void)
{
wchar_t str1[]=L"!using(\"fc2d\",\"math\"); init(::now,max,A,B)= now=0, max=30, A=array[max].free(), B=array[max].free(); ~GetMax(::max)=max; ~SetXY(x,y::now,A,B)= A[now]=x, B[now++]=y, PlotExe[]; f(x,y,n,t::now,A,B)= x=A,y=B,n=now; Plot{Ixdynamic : 1, Ioarray : HFor(\"f\"), Acolor,Vred};"; //存放Forcal表达式
fcVOID nModule;
void *hModule,*myFor,*Para;
fcINT err1,err2,PareNum;
int i,max=0;
double d,*xx;
wcout.imbue(locale("chs")); //设置输出的locale为中文
wcin.imbue(locale("chs")); //设置输入的locale为中文
if(!InitGForcal()) return; //初始化GForcal
LoadDll(L"\"FcDll\\FcMath32W.dll\",\"FcDll\\FC2D32W.dll\""); //加载Forcal扩展库
if(!UseForcal(2)) //申请使用Forcal
{
nModule=0; //由MForcal自动指定模块号
ComModule(str1,nModule,hModule,err1,err2); //将字符串源代码编译为模块
ExeModule(hModule,NULL,NULL,NULL); //执行模块
UseForcal(0); //归还Forcal的使用权
}
if(!UseForcal(2)) //申请使用Forcal
{
if(GetFor(L"GetMax",2,NULL,nModule,myFor,Para,PareNum)) //查找全局函数GetMax
{
if(PareNum==-1) //函数有0个自变量
{
max=(int)RealCal(myFor,(double *)Para);
wcout<<L"总数据组数＝"<<max<<L"\r\n";
}
}
UseForcal(0); //归还Forcal的使用权
}
for(i=0,d=0.0;i<max;i++,d=d+0.5)
{
if(!UseForcal(2)) //申请使用Forcal
{
if(GetFor(L"SetXY",2,NULL,nModule,myFor,Para,PareNum)) //查找全局函数SetXY
{
if(PareNum==1) //函数有2个自变量
{
xx=(double *)Para; xx[0]=d; xx[1]=d*sin(d);
RealCal(myFor,xx);
wcout<<L"发送数据 "<<xx[0]<<L", "<<xx[1]<<L"\r\n";
}
}
UseForcal(0); //归还Forcal的使用权
}
Sleep(1000); //延时1秒
}
wcin.get();
FreeDll(); //卸载Forcal扩展库
FreeGForcal(); //释放GForcal
}

演示效果如下图：

3.2 C#例子

该例子是3.1中C/C++例子的C#实现，演示效果完全相同。

感谢刘圆圆先生（mgenx@live.com）为 该例子编写了C#代码，下载：http://www.forcal.net/xiazai/forcal9/forcal9code.rar

版权所有© Forcal程序设计 2002-2011，保留所有权利
E-mail: forcal@sina.com QQ：630715621
最近更新: 2011年02月01日