PSPAINT(面描画 PostScript出力)

dftone, dfrgbt, dfcols, dfc40s | dframe, dframo, paintm, paintw, dresol
| dfpcol, paintc, paintr, paintp

概 要
 PSPAINT は,PostScriptプリンタへの面描画出力を行うためのルーチン群であり,
PSPLOT の配下で動作する.
 機能としては,2次元配列データに対する濃淡もしくはカラーによる表示,および
円・矩形・多角形のぬりつぶしが行える.
 1組の2次元配列データの表示は,dftone による濃淡階調指定もしくは dfrgbt 
または dfcols/dfc40s によるカラー階調の指定を行ったのち,dframe/dframo で
描画位置等の指定を行い,paintm で実際の描画を行う.また,paintw は dfcols 
で指定したカラー(色相+明度)を用いて,2組の2次元配列データの陰影つきカラー
階調表示を行う.
(dfcols は,paintm と paintw の両方に対してカラー階調指定の効果をもつが,
両者で用いられるカラーは彩度・明度について相違がある.)
 paintc, paintr, paintp は,dfpcol で指定した濃淡/カラーで,円・矩形・
多角形のぬりつぶしを行う.

DFTONE, DFRGBT, DFCOLS, DFC40S
1.機 能
  ・dftone ルーチンは,paintm ルーチンによる2次元配列データ表示をモノクロ
     表示に指定し,その濃淡階調を定義する.
  ・dfrgbt/dfcols/dfc40s ルーチンは,paintm ルーチンによる2次元配列データ
     表示をカラー表示に指定し,そのカラー階調を定義する.dfrgbt は その個々
     のカラーコードテーブルを配列として与えることにより,dfcols は 色相 と
     暗度 の範囲指定によるテーブル自動生成で,カラー階調を定義し,dfc40s は
     階調数 40 の標準カラー階調の採用を指定する.
  ・dfcols ルーチンは,同時に paintw ルーチンによる陰影つきカラー階調表示の
     カラーテーブルをも自動生成する.

2.呼出し手順と引数

      call dftone(nlevel, mtone, ktnlo, ktnhi, ktnvd)
  nlevel  [int]   階調数(1〜50)
  mtone   [int]   階調数に対応した濃淡レベルを指定する配列
  ktnlo   [int]   下限以下の値に対応させる濃淡レベル
  ktnhi   [int]   上限以上の値に対応させる濃淡レベル
  ktnvd   [int]   未定義データ領域に対応させる濃淡レベル
                  (範囲外の値 例えば -1 を指定すると 白 とみなされる)
        濃淡レベルの値は,いずれも 0〜255 でなければならず,255 を最大値と
        する輝度を表す.すなわち,0 が黒を,255 が白を意味する.
        nlevel=0 の指定が許され,そのときは,mtone 以降の引数は参照されず,
        階調数 20 のデフォールト設定が有効となる.

      call dfrgbt(nclev, mrgb, kclo, kchi, kcnv)
      call dfcols(nclev, hue, dark, kcnv)
      call dfc40s()
  nclev   [int]   階調数(1〜50)
  mrgb    [int]   階調数に対応したカラーコードテーブルを指定する配列
  kclo    [int]   下限以下の値に対応させるカラーコード
  kchi    [int]   上限以上の値に対応させるカラーコード
  kcnv    [int]   未定義データ領域に対応させるカラーコード
                  (範囲外の値 例えば -1 を指定すると 白 とみなされる)
  hue     [float] カラーテーブルを自動生成する際の色相範囲割合(0.2〜1.2)
  dark    [float] カラーテーブルを自動生成する際の暗さ加減の割合(0.〜1.6)
                  paintm に対しては,有効データ範囲の両端寄りの値に対応させる
                  カラーをどの程度暗くするかを制御し,paintw に対しては,補助
                  データに対する明度階調のコントラストをどの程度強くするかを
                  制御することになる.
         特例として,nclev=0 の指定が許され,そのときは 2番目以降の引数は参
        照されず,階調数 20 のデフォールトカラー設定(call dfcols(20,1.,1.,-1)
        の実行結果と同じ)が有効となる.また,dftone と dfrgbt/dfcols のいず
        れも呼び出されないと,このデフォールトカラー設定が有効となる.
         カラーコードの値は,RGB 各 8ビット 計24ビットの正の値で表現する.
        各8ビットは,その色の光の 255 を最大とする輝度を表す.16777215 が白,
        0 が黒となる.

DFRAME, DFRAMO, PAINTM, PAINTW, DRESOL
1.機 能
    2次元配列で格子点上に与えられたデータを線形補間して(双一次曲面の
  表現になる),データのラスター化を行い,濃淡表現またはカラー表現で
  図化する.ラスター化の分解能はデフォールトで,約 0.34mm に設定され
  ている.dframe/dframo ルーチンで描画の位置と大きさ等を事前に設定し,
  paintm/paintw ルーチンが,実際の描画を行う.dresol ルーチンは,ラス
  ター化分解能の既定値を変更する.

2.呼出し手順と引数

      call dframe(xo, yo, wd, hi, imax, jmax)
  xo, yo      [float] 基点(左下隅)の座標値(cm単位)
  wd          [float] 描画の横幅(cm単位,負なら基点の左側に描かれる.)
  hi          [float] 描画の高さ(cm単位,負なら基点の下側に描かれる.)
  imax, jmax  [int]   右方向,上方向の格子点数(両端ともカウントする.)
                      格子点データ2次元配列の整合寸法を規定する.
          通常(imax>0, jmax>0)は,FORTRAN での配列宣言が (imax, jmax) で
          あり,格子位置の右方向へ先に変化する順序で配列要素が並ぶものと想定
          している.格子位置の上方向へ先に変化する順序で配列要素が並ぶ場合に
          は,imax,jmax とも負の値で与える.このとき,FORTRAN での配列宣言は
          (-jmax, -imax) であるとみなされる.

      call dframo(x0, y0, x1, y1, x2, y2, imax, jmax)
  x0, y0      [float] 基点(データ配列の(1,1)の位置)の座標値(cm単位)
  x1, y1      [float] データ配列の(imax,1)位置の座標値(cm単位)
  x2, y2      [float] データ配列の(1,jmax)位置の座標値(cm単位)
  imax, jmax  [int]   格子点データ2次元配列の整合寸法(imax>1, jmax>1)
          (x0,y0), (x1,y1), (x2,y2) の3頂点と第4頂点 (x1+x2-x0, y1+y2-y0) で
          囲まれる一般に傾斜した斜交格子上の描画を行うことができる.

      call paintm(v, vlo, vhi, vnvd)
      call paintw(v, vlo, vhi, vnvd, u)
  v           [float] 格子点データを与える配列(要素数 imax×jmax)
  vlo         [float] 階調レベルの下限に設定する格子点データの値.
  vhi         [float] 階調レベルの上限に設定する格子点データの値.
  vnvd        [float] 格子点データが未定義であることを示す数値を与える.
  u           [float] 補助格子点データを与える配列(要素数 imax×jmax)
                      この値は,予め 0〜1 の範囲に正規化されているものとする.
                      補助データに対する明度の諧調数は 20 に固定されている.

      call dresol(nras)
  nras        [int]   paintm/paintw ルーチンにおけるラスター化分解能を変更し,
                      25.4mm * (nras / 600) にする.但し,nras≦0 のときは,
                      既定の約 0.34mm (nras=8) に復元する.
                      例えば,nras=2 のとき 既定に対し4倍細かい分解能となる.
          このルーチンは,dframeルーチンより先に呼び出さないと効果がない.

DFPCOL, PAINTC, PAINTR, PAINTP
1.機 能
  ・dfpcol ルーチンは,paintc/paintr/paintp ルーチンによる 図形ぬりつぶし
     に用いる濃淡レベルまたはカラーを指定し,
  ・paintc ルーチンは,円形のぬりつぶしを,
  ・paintr ルーチンは,矩形のぬりつぶしを,
  ・paintp ルーチンは,多角形のぬりつぶしを行う.

2.呼出し手順と引数

      call dfpcol(key, mcol)
  key     [int]   ぬりつぶし色の種別を規定する.(0〜2)
  mcol    [int]   key=0 のとき,濃淡レベルを 0〜255 の値で指定する.
                  key=1 のとき,カラーコードを 0〜16777215 の値で指定する.
                                 但し,(-1)〜(-255) の値の指定も許され,モノ
                                 クロ濃淡レベルの 1〜255 に対応づけられる.
                  key=2 のとき,現用の階調レベル番号で指定する.
                  (モノクロのとき mtone(mcol),カラーのとき mrgb(mcol) の色)
        dftone/dfrgbt ルーチンでは,下限以下・上限以上・未定義 のデータに対応
        させる濃淡レベル/カラーコードを,階調レベルと同じ配列に収容しており,
        key=2 の場合は,mcol の値の範囲として,0 から (階調数+2) まで許され
        る.そのとき,mcol=0 が下限以下,mcol=(階調数+1) が上限以上,mcol=
        (階調数+2) が未定義 に対応する.

      call paintc(xc, yc, radius)
  xc, yc      [float] 円の中心の座標値(cm単位)
  radius      [float] 円の半径(cm単位)

      call paintr(xorg, yorg, wide, high)
  xorg, yorg  [float] 基点(wide>0, high>0 なら左下隅)の座標値(cm単位)
  wide        [float] 矩形の横幅(cm単位,負なら基点の左側に矩形が描かれる.)
  high        [float] 矩形の高さ(cm単位,負なら基点の下側に矩形が描かれる.)

      call paintp(xa, ya, npt, inc)
  xa, ya      [float] 座標データが格納されている配列(その先頭要素位置)
  npt         [int]   座標データ点の個数(3以上の値でなければならない)
  inc         [int]   座標データ配列から各座標データ値を取り出す間隔
                      (正の値でなければならない)
        多角形は,1番目の(頂点)座標から 2番目の座標へ,2番目の座標から 3番目
        へ,3番目から 4番目へと順次結ばれ,(npt)番目の頂点の次は 1番目の頂点へ
        結ばれる.そのとき,ぬりつぶしは non-zero winding rule(反時計回りに囲
        われた回数から,時計回りに囲われた回数を引いたものが,0 でない領域が選
        択される)に基づいて行われる.

PSPAINT 使用例
      dimension v(151,101)
      dimension g(2,2), h(2,2), xm(9), ym(9), pos(2,4), q(3,2)
      data g  / -110., -110., +110., +110./,  h / 0., 1., 0., 1./,
     *     xm / 0.0, 0.0, 2.5, 0.5, 1.5, 2.5, 0.5, 3.0, 3.0 /,
     *     ym / 0.0, 3.0, 2.0, 1.0, 0.5, 1.0, 2.0, 3.0, 0.0 /,
     *     pos/ 5.,0., 5.,2., 8.,0., 8.,2. /,
     *     q  / 0., 1., 2.,  1., 2., 0. /
      do 111 i=1,151
        x = float(i-76)
        a = float(i-86)
        do 111 j=1,101
          y = float(j-51)
          b = float(j-31)
          r = sqrt(x*x + y*y)
          s = sqrt(a*a + b*b)
          v(i,j) = r*3. - s*2. + 17.
          if(r.gt.50.) v(i,j) = 999.
  111 continue
      call psopn('pspaint.ps', 'a4p')
      call plots(2., 2.)
      call dfcols(0)
      call dframe(0., 12., 15., 10., 151, 101)
      call paintm(v, -80., 120., 999.)
      call newpen(3)
      call wrect(0., 12., 15., 10.)
      call dfpcol(1, 255*256*256)
      call paintr(2., 19., 3., 3.)
      call dframe(10., 0., 5., 10., 2, 2)
      call paintw(g, -100., 100., 999., h)
      call dfpcol(0, 200)
      call paintp(xm, ym, 9, 1)
      call newpen(2)
      call plot(xm(9), ym(9), 3)
      do 9 i=1,9
        call plot(xm(i), ym(i), 2)
    9 continue
      call paintp(pos(1,1), pos(2,1), 4, 2)
      call dftone(0)
      call dframe(0., 5., 8., 4., 3, 2)
      call paintm(q, 0., 2., 99.)
      call dfpcol(1, 255*256+255)
      call paintc(2., 7., 0.7)
      call plote
      call pscls
      stop
      end