IXP

IXPは,汎用プロットライブラリです.X-Window,PostScript,PNG,JPEGへの出力が可能です.

文献は以下です.
鶴岡弘.地震研技術報告. No8. pp 46-49. Webに適したプロットライブラリの改良
Xのbackingstore機能を利用しなくても再描画をするように機能強化?しました.
ただし,Xに出力する場合,関数pc_flush(iwin) を呼び出すまでは画面には描画されません.(ver.1との違い)

インストールの仕方

プログラム ixp.v2.tar.Z を解凍して Makefile を編集し,

フルバージョンの場合
% make ixp; ライブラリの作成
% make testf-ixp; testc-ixp !サンプルプログラムの作成
% ./testf or ./testc !サンプルプログラムの実行

XおよびPS出力のみを利用する場合
% make xp; ライブラリの作成
% make testf-xp; testc-xp !サンプルプログラムの作成
% ./testf or ./testc !サンプルプログラムの実行

バージョン1はこちら

マニュアル

以下は暫定版です.
iwin=0, iwin=1 と書いてありますが,
以下は
iwin = 0,1,2,3 --> plot X-Window
iwin = 10 --> plot PostScript
iwin = 11 --> plot PNG
iwin = 12 --> plot JPEG
と読み替えてください.

int    -> integer*4
float  -> real*4
char   -> character*(*)
[]     -> ()

座標系:	左下が(0.0,0.0)になります。
単位:長さの指定はmmです。

=========================
*プロット開始および終了
=========================

<<<-------------------------------------------------------------------------->>>
subroutine pc_plotinit(iwin, filename, x0, y0, xsize, ysize, fscale)
	int             iwin;
	char            filename;
	float           x0, y0, xsize, ysize, fscale;
機能:プロットの開始。
iwin: 0[PS]/1[GIF]
filename: 出力ファイル名の指定
	filename='sample.ps'//char(0)
	とするとsample.psファイルに出力します。
    ここでの注意点は文字列の最後にNULL(char(0))を必ずつけ加えてください。
x0, y0: この変数は過去のライブラリとの互換性を保つためにあります。適当に値を指定してください。
xsize, ysize: 出力ファイルの横、および縦のサイズの指定
	iwin=0の時
		PostScript出力はA4に限られます。ysize/xsize > 1.0 の時には、Portrait それ以外は
		Landscape出力になります。fscaleは機能しません。
	iwin=1の時
		xsize=100, ysize=100, fscale=1.0 とした場合には、
		width = xsize * fscale * 2.4 = 240
		height = ysize * fscale * 2.4 = 240
		大きさ240x240の画像ファイルを作成します。
fscale: 画像サイズの拡大・縮小

<<<-------------------------------------------------------------------------->>>
subroutine pc_plotend(iwin, end)
	int             iwin;
	int             end;
機能:プロットの終了。
iwin: 0[PS]/1[GIF]
end: この変数は過去のライブラリとの互換性を保つためにあります。適当に値を指定ください。

<<<-------------------------------------------------------------------------->>>
subroutine pc_pscode(iwin, code)
	int		iwin;
	int             code;
機能:ポストスクリプト出力におけるモノクロ/カラーの切り替え
iwin: 0[PS]/1[GIF]
code: 0[モノクロ(デフォルト)]/1[カラー]
	iwin=0の時にモノクロでなく、カラーで出力したい場合には、pc_pscode(0,1)をpc_plotinit()の前で
	実行してください。iwin=1の時には指定する必要はありません。
	call pc_plotini(0,1)  --- カラーモード
	call pc_plotinit(....)
	call pc_line(....)
	.......

=========================
*プロットサブルーチン
=========================
	これらのサブルーチンはpc_plotinit, pc_plotendの中に記述します。

<<<-------------------------------------------------------------------------->>>
subroutine pc_line(iwin, x1, y1, x2, y2)
	int             iwin;
	float           x1, y1, x2, y2;
機能:(x1,y1)から(x2,y2)まで線をプロットする。
iwin: 0[PS]/1[GIF]
x1, y1: プロット開始点座標
x2, y2:プロット終了点座標

<<<-------------------------------------------------------------------------->>>
subroutine pc_plot(iwin, x, y, n)
	int             iwin;
	float           x[], y[];
	int             n;
機能:連続した直線をプロットする。
iwin: 0[PS]/1[GIF]
x(), y(): プロットする点を格納した配列
n: プロット点の総数

<<<-------------------------------------------------------------------------->>>
subroutine pc_polygon(iwin, x, y, n, outline)
	int             iwin;
	float           x[], y[];
	int             n;
	int             outline;
機能:閉じた多角形のプロット
iwin: 0[PS]/1[GIF]
x(), y(): プロットする点を格納した配列
n: プロット点の総数
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。
* n < 2048 です。2048以上の多角形をプロットするときには、メモリのリークが発生します。

<<<-------------------------------------------------------------------------->>>
subroutine pc_rect(iwin, x, y, wx, wy, outline)
	int             iwin;
	float           x, y, wx, wy;
	int             outline;
機能:長方形のプロット
iwin: 0[PS]/1[GIF]
x,y: 左下の座標
wx, wy; 横、縦の大きさの指定
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_circle(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:円○のプロット
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 半径の大きさ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_triangle(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:三角形△のプロット
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_triangle1(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:三角形△のプロット(pc_triangleを90°時計回りに回転)
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_triangle2(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:三角形△のプロット(pc_triangleを180°時計回りに回転)
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_triangle3(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:三角形△のプロット(pc_triangleを270°時計回りに回転)
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_square(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:正方形□のプロット
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_diamond(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:菱形◇のプロット
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。


<<<-------------------------------------------------------------------------->>>
subroutine pc_plus(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:+のプロット
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_times(iwin, x, y, size, outline)
	int             iwin;
	float           x, y, size;
	int             outline;
機能:Xのプロット
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_symbol(iwin, x, y, size, symbol, outline)
	int             iwin;
	float           x, y, size;
	int             symbol, outline;
機能:シンボル(○、□、◇ ... )のプロット。
iwin: 0[PS]/1[GIF]
x,y: 中心の座標
size: 一辺の長さ
symbol: シンボルの指定
 	1 - ○
	2 - □
	3 - +
	4 - △
	5 - ◇
	6 - △ + 90回転
	7 - ▽
	7 - △ + 270回転
	9 - X
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。

<<<-------------------------------------------------------------------------->>>
subroutine pc_vector(iwin, x, y, direction, length, tw, hl, hw, outline)
	int             iwin;
	float           x, y, direction, length;
	float           tw, hl, hw;
	int             outline;
機能:矢印-->のプロット
iwin: 0[PS]/1[GIF]
x, y: 矢印プロット開始点
direction: 水平からの回転角反時計回り正
tw: tailwidth
hl: headlength
hw: headwidth
outline: 1の時は外枠だけをプロットし、0の時には、中を塗りつぶします。
*以下の条件を満たすように変数を指定してください。
	length > hl
	hw > aw

<<<-------------------------------------------------------------------------->>>
subroutine pc_text(iwin, xin, yin, size, text, angle, ntext, ipos)
	int             iwin;
	float           xin, yin, size, angle;
	char           *text;
	int             ntext;
	int             ipos;
機能:テキストのプロット
iwin: 0[PS]/1[GIF]
xin, yin: テキストプロット基準点座標
size: テキストサイズの指定(単位mm)
	 8point -> 2.8
	 9point -> 3.1
	10point -> 3.5
	11point -> 3.8
	12point -> 4.2
	14point -> 4.9
	18point -> 6.3
	24point -> 8.4
text: プロットしたい文字列
angle: 水平からの回転角反時計回り正
ntext: 文字列のテキスト数
ipos: テキストプロット基準点の位置
	    7       8        9
	    |~~~~~~~~~~~~~~~~|
	    |4      +5      6|
	    |________________|
	    1       2        3
* 漢字は出力できません。

====================================
色、線の幅などの設定
====================================

<<<-------------------------------------------------------------------------->>>
subroutine pc_setbkcolor(iwin, r, g, b)
	int             iwin;
	int             r, g, b;
機能:背景の色指定
iwin: 0[PS]/1[GIF]
r,g,b: R,G,Bをそれぞれ256階調(0-255)で指定します。
* iwin=0の時には、pc_plotinit()より前に実行します。

<<<-------------------------------------------------------------------------->>>
subroutine pc_setcolor(iwin, r, g, b)
	int             iwin;
	int             r, g, b;
機能:色指定
iwin: 0[PS]/1[GIF]
r,g,b: R,G,Bをそれぞれ256階調(0-255)で指定します。

<<<-------------------------------------------------------------------------->>>
subroutine pc_alloccolor(iwin, no, r, g, b)
	int             iwin;
	int             no, r, g, b;
機能:色の割り当て
iwin: 0[PS]/1[GIF]
no: 色を割り当てる番号
r,g,b: R,G,Bをそれぞれ256階調(0-255)で指定します。
*noは63までの整数を指定してください。

<<<-------------------------------------------------------------------------->>>
subroutine pc_setqbcolor(iwin, no)
	int		iwin;
	int		no;
機能:pc_alloccolorで割り当てられた色に変更します。
iwin: 0[PS]/1[GIF]
no: 色を割り当てた番号
* 標準では、以下のように割り当てられています。
      no= 0 (  0,   0,   0)  no= 1 (  0,   0, 255)
      no= 2 (  0, 255,   0)  no= 3 (  0, 255, 255)
      no= 4 (255,   0,   0)  no= 5 (255,   0, 255)
      no= 6 (255, 255,   0)  no= 7 (255, 255, 255)
      no= 8 (  0,   0,   0)  no= 9 (  0,   0,   0)
      no=10 (  0,   0,   0)  no=11 (  0,   0,   0)
      no=12 (  0,   0,   0)  no=13 (  0,   0,   0)
      no=14 (  0,   0,   0)  no=15 (  0,   0,   0)
      no=16 (  0,   0,   0)  no=17 (  0,   0,   0)
      no=18 (  0,   0,   0)  no=19 (  0,   0,   0)
      no=20 (  0,   0,   0)  no=21 (  0,   0,   0)
      no=22 (  0,   0,   0)  no=23 (  0,   0,   0)
      no=24 (  0,   0,   0)  no=25 (  0,   0,   0)
      no=26 (  0,   0,   0)  no=27 (  0,   0,   0)
      no=28 (  0,   0,   0)  no=29 (  0,   0,   0)
      no=30 (  0,   0,   0)  no=31 (  0,   0,   0)
      no=32 (255,   0,   0)  no=33 (255,  32,   0)
      no=34 (255,  65,   0)  no=35 (255,  98,   0)
      no=36 (255, 131,   0)  no=37 (255, 164,   0)
      no=38 (255, 197,   0)  no=39 (255, 230,   0)
      no=40 (246, 255,   0)  no=41 (213, 255,   0)
      no=42 (180, 255,   0)  no=43 (148, 255,   0)
      no=44 (115, 255,   0)  no=45 ( 82, 255,   0)
      no=46 ( 49, 255,   0)  no=47 ( 16, 255,   0)
      no=48 (  0, 255,  16)  no=49 (  0, 255,  49)
      no=50 (  0, 255,  82)  no=51 (  0, 255, 115)
      no=52 (  0, 255, 148)  no=53 (  0, 255, 180)
      no=54 (  0, 255, 213)  no=55 (  0, 255, 246)
      no=56 (  0, 230, 255)  no=57 (  0, 197, 255)
      no=58 (  0, 164, 255)  no=59 (  0, 131, 255)
      no=60 (  0,  98, 255)  no=61 (  0,  65, 255)
      no=62 (  0,  32, 255)  no=63 (  0,   0, 255)

<<<-------------------------------------------------------------------------->>>
subroutine pc_setfont(iwin, no)
	int             iwin;
	int             fontno;
機能:フォントの設定
iwin: 0[PS]/1[GIF]
fontno:	0 -> Normal
        1 -> Bold
	2 -> Italic
	3 -> Italic Bold
* fontはHelveticaです。

<<<-------------------------------------------------------------------------->>>
subroutine pc_setline(iwin, linewidth)
	int             iwin;
	int             linewidth;
機能:線の幅の設定
iwin: 0[PS]/1[GIF]
linewidth: 線の幅の指定
* iwin=1の時は、linewidth>=4の時に、2ドットの太さの線になります。細かな指定はできません。

<<<-------------------------------------------------------------------------->>>
subroutine pc_setdash(iwin, dashtype)
	int             iwin;
	int             dashtype;
機能:線の種類の設定
iwin: 0[PS]/1[GIF]
dashtype: 0 -> ___________
	  1 -> . . . . . . 
	  2 -> . _ . _ . _ 
* iwin=1 の時は機能しません。すべて実線になります。

<<<-------------------------------------------------------------------------->>>
subroutine pc_setgrayshade(iwin, grayshade)
	int             iwin;
	int             grayshade;
機能:モノクロプロットの際のシェーディングの指定

void            pc_setgrayshade();
iwin: 0[PS]/1[GIF]
grayshade: 階調を0(黒) - 255(白)の間で設定します。
* iwin=1の時は機能しません。
  iwin=0の時に、outline=1にしても、シンボルのプロットは、ここで指定された階調で
 塗りつぶしになります。

 */