0%

上一章中绘制的图像可以通过更改基元的属性来让绘制的图像发生变化。这些改变属性的函数如下示:

属性 函数
颜色索引 PGSCI
颜色显示 PGSCR, PGSCRN,和 PGSHLS.
线条类型 PGSLS
线条宽度 PGSLW
字符高度 PGSCH
字符字体 PGSCF
文本背景 PGSTBG
填充区域风格 PGSFS, PGSHS.

上述这些设置程序可以混杂使用。

一旦一个属性在适当的地方被调用后,这个属性会影响到后续的绘图,直到这个属性再次改变为止。

上述说明可以通过PGSxx用于设置新的属性,同样PGQxx用于查询基元的当前值,这样就可以在改变属性之前保存老的属性。

文字主要用来做一些标记注释或者标题。

比如使用pgtext、pgptext、pgmtxt等等。

##转义字符的含义

转义字符 解释
\u 开始一个上标或结束一个下标
\d 开始一个下标或结束一个上标 (记住\u和\d 必须成对出现)
\b 退格
\fn 正常字体
\fr 罗马字体
\fi 意大利字体
\fs 手写体
\ 反斜杠字符
\x 乘号×
. 居中点
\A 物理中埃 (Å)
\gx 希腊字母
\mn \mnn 图标记,参考附录
(nnnn) 如果其中一个n的后面不是数字或者),那么)可能会被忽略。这个用于表示一些特殊字符(数学符号、音乐符号、天文符号和地制图的符号),参考附录

代码测试如下:

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
/// > upper and lower font
cpgtext(1.0,1.0,"SHAO\\u2011\\d");
/// > backspace
cpgtext(1.0,2.0,"SHAO\\b");
/// > normal font
cpgtext(1.0,3.0,"\\fnSHAO");
/// > roma font
cpgtext(1.0,4.0,"\\frSHAO");
/// > italy font
cpgtext(1.0,5.0,"\\fiSHAO");
/// > hand writing font
cpgtext(1.0,6.0,"\\fsSHAO");
/// >
cpgtext(1.0,7.0,"\\\\x\\.\\A");

/// > Greek alphabet
/// > alpha/beta/gamma/delta/epsilon/zeta/eta/theta
/// > iota/kappa/lambda/mu/nu/xi/omicron/pi
/// > rho/sigma/tau/upsilon/phi/chi/psi/omega
cpgtext(1.0,8.0,"\\ga\\gA|\\gb\\gB|\\gg\\gG|\\gd\\gD|\\ge\\gE|\\gz\\gZ|\\gy\\gY|\\gh\\gH|");
cpgtext(1.0,9.0,"\\gi\\gI|\\gk\\gK|\\gl\\gL|\\gm\\gM|\\gn\\gN|\\gc\\gC|\\go\\gO|\\gp\\gP|");
cpgtext(1.0,10.0,"\\gr\\gR|\\gs\\gS|\\gt\\gT|\\gu\\gU|\\gf\\gF|\\gx\\gX|\\gq\\gQ|\\gw\\gW|");

cpgtext(5.0,1.0,"\\m1 \\m2 \\m3 \\m4 \\m5 \\m6 \\m7 \\m8 \\m9 \\m10");
cpgtext(5.0,2.0,"\\m11 \\m12 \\m13 \\m14 \\m15 \\m16 \\m17 \\m18 \\m19 \\m20");
cpgtext(5.0,3.0,"\\m21 \\m22 \\m23 \\m24 \\m25 \\m26 \\m27 \\m28 \\m29 \\m30 \\m31");
...

区域填充可以让程序员把任意多边形的内部进行着色或渲染。

主要函数为pgploy(画任意多边形)、pgrect(画简易矩形)、pgcirc(画圆)。

例如,用PGPLOT (10,nx,ny)作图如下:

1
2
3
4
5
6
7
8
9
//file shao_pgplot_area_fill.
float xs[11] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
float ys[11] = {0.0, 1.0, 4.0, 6.0, 8.0, 8.0, 7.0, 8.0, 6.0, 4.0, 0.0};

cpgpoly(11, xs, ys);

cpgrect(1.0, 9.0, 1.0, 8.0);

cpgcirc(5., 5., 5.);

图标记就是一些符号,例如·、○、■、×等符号。这些符号为了标记一些特殊的点。

我们可以调用pgpt1来绘制这些标记。

标记符号太多了,这里画了10个不同的标记。

1
2
3
4
5
6
/// @file shao_pgplot_graph_markers.c
for (j = 0; j < 10; j++) {
for (i = 0; i < 10; i++) {
cpgpt1(i * 1.0 +1.0, j * 1.0 + 1.0, i * 10 + j);
}
}

随便写了一个从1到10的标记如图所示。

不同的标记如下所示:

Graph Markers

绘制线条的函数为pgline。这个函数可以绘制一条或多条直线线段。这个函数的详细介绍参考索引

还有两个更基础的pgmove和pgdraw。这些主要应用于数控绘图机上,所以一般我们用模块化比较好的pgline。

Pgline线条可以有pgmove和pgdraw组合而成 。两者的转化如下所示:

(主要显示出两者转化的代码,全部的代码如最基础代码所示。)

实例如下:

1
2
3
cpgline(n, xr[1], yr[1]);
for (i = 2; i < n; i++)
cpgdraw(xr[i],yr[i]);

等效于

1
cpgline(n, xr, yr);

在视口边缘的基元可能要被剪裁掉。

由于默认显示的规则不同,所以四种基元被裁减掉的可能性如下:

  • 线条在与viewport的交叉处外被裁剪;
  • 如果图标记的中心在viewport边缘或者里面就会画出来,否则就裁剪掉;
  • 文字除非越过了view surface,一般都不会裁减掉;
  • 区域填充也是在 viewport的边缘裁减掉;

在上一章选定好我们的窗口和视口后,我们就可以开始作图了。

本章我们描述最基础的程序,叫做基元。基元就是可以画出图像的元素。

这里有四种不同的基元:

  • lines:线条
  • graph-markers:图标记
  • text:文字
  • area fill:区域填充

通过下面的函数:

1
2
PGBOX ('BCTN', 0.0, 0, 'BCNST', 0.0, 0)
CALL PGLAB ('Epoch', 'Flux Density (Jy)', 'Variation of 3C345 at 10.7 GHz')

来给图像做注解。

PGMTXT可以给视口中的任何一个点做注解。

通过调用PGSWIN来设置window属性。

1
PGSWIN (1975.0, 1984.0, 5.0, 20.0)

X轴从1975到1984

Y轴从5到20

这里将上面几个小部分提到的函数全部展示一下。

其实调用PGPAGE、PGSVP、 PGSWIN和 PGBOX 是比较不方便的方法,虽然可以随心所欲的展示一些成果。

这四个函数也可用通过一个集成的函数来搞定,即PGENV (for PGPLOT ENVironment)

比如

  • PGENV (1975.0, 1984.0, 5.0, 20.0, 0, 0)

与下面四个函数的效果是相同的

  • CALL PGPAGE
  • CALL PGVSTD
  • CALL PGSWIN (1975.0, 1984.0, 5.0, 20.0)
  • CALL PGBOX (‘BCNST’, 0.0, 0, ‘BCNST’, 0.0, 0)