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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
|
%表題 GRPH1 基本グラフィックルーチンライブラリ
%
%履歴
%\Drireki{
% 89/08/22 酒井 敏
% 91/09/05 林 祥介
% 91/11/21 酒井 敏
% 92/04/10 塩谷雅人 (PSファイルの再作成とDepsfの書き換え)
% 92/04/22 林祥介 (4.1版)
% 95/04/19 塩谷雅人
% }
%
\Dchapterhead
\label{sgpack}
\section{概要}
ここでは GRPH1 の中のユーザーインターフェイスを含むパッケージ
SGPACK の基本的な機能を, いくつかの簡単なプログラム例で示す.
これらのプログラムは dcl-x.x/demo/grph1/sgpack の中にあるので,
参考にしていただきたい.
なお, 座標系や座標変換, 各種出力プリミティブとその属性などに関する
基本用語は「GRPH1」マニュアルを参照のこと.
\vspace{1em}
出力例の図は縮小されている関係上,
線の太さなどの見た目が実際の出力結果と異なる場合があるので,
注意していただきたい.
また, サンプルプログラム中の {\tt !} 印は行末コメントであるが,
これはFORTRAN77の規格外の機能である.
説明の都合上, 地球流体電脳ライブラリの基本方針に反して,
あえて規格外の機能を使っていることをお許しいただきたい.
\vspace{1em}
%============================ SAMPLE 1 =================================
\section{V座標系で線分を描く}
%\label{sg.sglnv}
これはV座標系で線分を描くプログラム例である.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk01_0001.eps}\\
{\bf sgpk01.f:page1}\\
\end{center}
\vspace{1em}
\pagebreak
\begin{itemize}
\item {\bf 描画準備と終了:}
\begin{quote}
最初の {\tt SGOPN (SGpack OPeN)}
(以下では {\tt SGpack} を単に {\tt SG}と書く)
と最後の{\tt SGCLS (SG CLoSe)} は,
それぞれ初期化および終了処理をおこなうルーチンで,
この2つの間でSGPACKの各ルーチンを呼ぶことができる.
{\tt SGOPN} を実行した後, 実際の描画をはじめる前に,
もう一つのルーチン {\tt SGFRM (SG FRaMe)} を実行しなければならない.
これは作画領域を設定するもので,
1枚の白紙を用意すると考えていただければよい.
改ページをし,新たな作画領域を設定するときにもこのルーチンを使う.
\vspace{1em}
なお, {\tt SGPWSN} は使用可能なデバイス名を標準出力に書き出す
ルーチンである.
このプログラム例のように書いておくと,
普段使い慣れていないシステムでコンパイル・実行するときにも,
デバイス名のリストが出力されるので便利である.
\end{quote}
%
\item {\bf 線分描画(V座標系):}
\begin{quote}
まず,描画可能な範囲がどのように設定されているかについて
簡単に述べておく.
作画例のコーナーマークで示される長方形領域は,
ふつう出力画面あるいは出力用紙の四隅に描かれ,
その出力装置の最大作画領域を示す.
しかし,一般にこの長方形領域の縦・横比は1でないことが多いので,
標準的なオプション設定のもとでは,コーナーマークで示される長方形
領域に最大内接するような正方形領域を[0,1]$\times$[0,1]とするように
描画範囲が設定される
(ここで単位はR座標系であるが,透視変換を用いていなければV座標系と
等しい).
最大作画領域をいっぱいに使うことも可能で,
そのような例については第\ref{slpack}節を参照されたい.
\vspace{1em}
さて,実際の線分を描画するのが {\tt SGLNV (SG LiNe V)}で,
これは根回し型ルーチンである.
つまり線分の色と太さを指定するラインインデクス
は{\tt SGSLNI (SG Set LiNe Index)} によって設定する.
{\tt SGLNV}のルーチンの上意下達型が{\tt SGLNZV (SG LiNe ZV)}である.
ラインインデクスも同時に指定する点が
異なるだけで {\tt SGLNV} と全く同じ働きをする.
作画例のうち,上側の4本が{\tt SGLNV}による出力,
下側の4本が{\tt SGLNZV}による出力であるが,
同じ結果が得られていることがわかる.
\vspace{1em}
なお, ラインインデクスは3桁の整数(nnm)で,
上位2桁(nn)が色番号, 下位1桁(m)が線の太さである.
ただし, どんなディバイスでも色と太さの両方が変えられるとは
限らないので,色または太さしか変えられないようなディバイスでは
色と太さのインデクスを読みかえる.
たとえば,太さの変えられないようなディバイスで1桁の数字(太さ)を
指定していも, それは色のインデクスとして読みかえられ線分の色が変わる.
詳しくは「GRPH1」マニュアルを参照されたい.
\end{quote}
%
\end{itemize}
\newpage
\Dproginput{sgpack/sgpk01.f}
%============================ SAMPLE 2 =================================
\newpage
\section{U座標系で線分を描く}
%\label{sg.sglnu}
次にU座標系で線分を描いてみよう.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk02_0001.eps}\\
{\bf sgpk02.f:page1}\\
\end{center}
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk02_0002.eps}\\
{\bf sgpk02.f:page2}\\
\end{center}
\vspace{1em}
\begin{itemize}
\item {\bf ウインドウとビューポート:}
\begin{quote}
U座標系で線分を描くには,{\tt SGFRM} を実行したあとで
変換関数を定義する以下の4つのルーチンを呼ぶ:
{\tt SGSWND} {\tt (SG Set WiNDow)},
{\tt SGSVPT} {\tt (SG Set ViewPorT)},
{\tt SGSTRN} {\tt (SG Set TRansformation Number)},
{\tt SGSTRF} {\tt (SG Set Transformation Function)}.
このうち最初の3つを呼ぶ順番は任意であるが,{\tt SGSTRF}は
必ず最後に呼ばなければならない.
ここではU座標系の (0--1) $\times$ (0--1) の空間(ウインドウ)を
V座標系の (0--1) $\times$ (0--1) の空間(ビューポート)に投影するように
変換関数を定義しているので,
恒等変換となり, V座標系とU座標系は等しくなる.
(実は, {\tt SGFRM}を実行した段階で, この恒等変換が定義されているので,
作画例の1ページ目については,{\tt SGSWND}などによって
変換関数を改めて指定しなくても同じ結果になる.)
ここで, ウインドウとはU座標系上に描く図形のうち我々が実際に見たい領域であり,
ビューポートはその見たい領域を投影するV座標系上の領域である.
このウインドウとビューポートという言葉は今後よくでてくるので
よく覚えておいてほしい.
\vspace{1em}
また, {\tt SGSTRN}の引数は変換関数番号で,
1ならば線形座標, 4ならば両対数座標というように座標系のタイプを指定する.
変換関数に関する以上の情報は{\tt SGSTRF}を呼んではじめて有効になる.
そのあとに呼んでいる {\tt SLPVPR} はビューポートの枠を描く
SLPACK のサブルーチンである(GRPH1/SLPACK参照).
\end{quote}
%
\item {\bf 線分描画(U座標系):}
\begin{quote}
前出の {\tt SGSLNI} によりラインインデクスを設定して,
{\tt SGLNU} と {\tt SGLNZU} を使って実際の線分を描画する
(このほかにR座標系で作画するルーチンもあるが, ここでは述べない).
それぞれ, 根回し型と上意下達型のルーチンである.
ここで, {\tt SGLNZU}で指定したラインインデクスは,
{\tt SGLNU} のラインインデクスへ影響を及ぼさないことに
注意していただきたい.
\end{quote}
\item {\bf いろいろなウインドウ / ビューポート:}
\begin{quote}
{\tt SGFRM} により改ページをして,
新しいページの左上に前のページと同じ図形を描いてみる.
ウインドウとビューポートの設定に関しては,
{\tt SGSVPT} によるビューポートの指定のみが前のページのものと異なる.
ウインドウ, ビューポート, 変換関数番号に関する情報はすべて
SGPACK の内部変数管理ルーチン
{\tt SG}{\it p}{\tt GET/}{\tt SG}{\it p}{\tt SET}
{\tt (SG Parameter GET/SET)}が保持している.
(以下でも同様の表記をするが, 一般に{\it p} は{\tt R/I/L/C} のどれかで,
それぞれ, 実数, 整数, 論理変数, 文字変数用のルーチンに対応することを
あらわす. )
したがって, 変更部分のみを指定した上で, {\tt SGSTRF} によって
変換関数を確定してやればよい
(その意味では, この部分に関する {\tt SGSWND} の指定も実際にはいらない).
その結果,左上に前のページと同じ図形が縮小されて描かれる.
\vspace{1em}
その右側には {\tt SGSWND} のウインドウ指定で,
{\tt UYMIN}$>${\tt UYMAX}とし上下逆さまのウインドウを表示してみた.
\end{quote}
\item {\bf クリッピング:}
\begin{quote}
ウインドウとはU座標系上の我々が見たい部分であると書いたが,
{\tt SGSWND}で小さなウインドウを指定して図形の一部だけ表示させようとしても,
これだけでは作画しようとする図形がビューポートをはみ出してしまう.
ビューポートをはみ出す部分を描かないようにするためには
{\tt SGLSET}によって, クリッピングを制御する内部変数
{\tt 'LCLIP'}を{\tt .TRUE.} にしてやればよい.
\end{quote}
%
\end{itemize}
\newpage
\Dproginput{sgpack/sgpk02.f}
%============================ SAMPLE 3 =================================
\newpage
\section{折れ線を描く}
\label{sg.sgplu}
これは折れ線ルーチンの使用例である.
折れ線ルーチンも例によって4つ
(R座標系での作画ルーチンも含めると6つ)のタイプがあるが,
ここでは, U座標系で描画する根回し型ルーチンのみを取り上げる.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk03_0001.eps}\\
{\bf sgpk03.f:page1}\\
\end{center}
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk03_0002.eps}\\
{\bf sgpk03.f:page2}\\
\end{center}
\begin{itemize}
\item {\bf 折れ線描画 / ラインインデクスとラインタイプ:}
\begin{quote}
折れ線を描くルーチンは {\tt SGPLU (SG PolyLine U)} である.
折れ線ルーチンでは線分属性としてラインインデクスの他に,
実線, 点線等といったラインタイプが指定できる.
これらを変更するルーチンは, それぞれ {\tt SGSPLI} と {\tt SGSPLT} である.
1ページ目にはいろいろなラインインデクスと
ラインタイプの例を示してある.
\end{quote}
%
\item {\bf サイクル長を変える:}
\begin{quote}
{\tt SGPLU} で描く点線や破線のパターンの1サイクルの長さは
V座標系で指定されている.
したがって, 小さなビューポートで描画するとビューポートの
大きさに比べてパターンが長すぎるため,線分部分と空白部分の
バランスが悪くなることがある.
それとは逆に, ディスプレイ等に点線や破線を表示した場合,
ディスプレイの分解能が悪いと,
パターンが潰れて判別できなくなることもある.
そのようなときには {\tt SGRSET}
で内部変数 {\tt 'BITLEN'} を変更すると,
パターンのサイクル長を変えることができる.
%{\tt SGPSET} ではこの他にも細かなパラメーターの変更が可能である.
\end{quote}
%
\item {\bf パターンを変える:}
\begin{quote}
GRPH1 では実線, 破線, 点線, 一点鎖線の4種類の線種を指定できるが,
これ以外のパターンの線種も指定することができる.
実は, {\tt SGPLT} の引数に4より大きい数値を指定すると,
その整数の2進表現のパターンを指定したものと見なされる.
すなわち, 整数の下位16 bit のうち1の部分に線を描き,
0の部分は空白となるようなパターンを設定する.
このパターンを表わす整数を求めるには MISC1/BITLIB の中の
{\tt BITPCI} を使うと便利である.
\vspace{1em}
さらに複雑なパターンを指定したいときには,
{\tt SGISET} で内部変数{\tt 'NBITS'}を変更することにより,
パターンのビット長を32 bitまで長くすることができる.
\end{quote}
%
\item {\bf 欠損値処理:}
\begin{quote}
データの中に欠損がある場合には,
MATH1/SYSLIB の中の {\tt GL}{\it p}{\tt SET (GLobal Parameter SET)}
で欠損値処理の指定に関する内部変数 {\tt 'LMISS'} を {\tt .TRUE.} にして,
欠損値処理を有効にする.
このように指定すると,座標成分(x,y)のどちらかが 999. である点を
欠損値と見なして線を結ばない.
また, 有効な点が欠損値に囲まれ, 一点だけ孤立している様な場合には,
有効な点を線で結ぶことはできないので,
そこには何も描かれない.
欠損値 999. の値が実際のデータ範囲に入っていて,
999. 以外の値にしたい場合には, {\tt GLRSET} によって
実数の欠損値をあらわす内部変数{\tt 'RMISS'}を変更してやればよい.
\vspace{1em}
欠損値処理の制御は,SGPACK だけでなくプログラム全体で統一的に
行われなければならないため,欠損値処理に関する内部変数の管理は
{\tt SG}{\it p}{\tt GET/}{\tt SG}{\it p}{\tt SET}ではなく
{\tt GL}{\it p}{\tt GET/}{\tt GL}{\it p}{\tt SET}で行われてる.
\end{quote}
\end{itemize}
\Dproginput{sgpack/sgpk03.f}
%============================ SAMPLE 4 =================================
\newpage
\section{マーカー描画}
\label{sg.sgpmu}
これはマーカーを描くプログラムである.
ここでも U座標系で描画する根回し型ルーチンのみを取り上げるが,
V座標系での作画ルーチンなども揃っている.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk04_0001.eps}\\
{\bf sgpk04.f:page1}\\
\end{center}
\begin{itemize}
\item {\bf いろいろなマーカー:}
\begin{quote}
指定された点列を折れ線で結ぶ代わりに,
点の位置にマーカーを描くのが{\tt SGPMU (SG PolyMarker U)} である.
マーカーの種類は {\tt SGSPMT (SG Set PolyMarker Type) }
でフォントテーブルのフォント番号を指定する.
マーカーの属性としてはマーカーの種類以外に,
マーカーの大きさ, ラインインデクスがあり,
それぞれ {\tt SGSPMS (SG Set PolyMarker Size)},
{\tt SGSPMI (SG Set PolyMarker Index)} で指定する.
また, {\tt SGLSET} で内部変数 {\tt 'LCLIP'}を{\tt .TRUE.}とし
クリッピングをするように指定すると,
マーカーもクリッピングされる.
\end{quote}
%
\item {\bf 折れ線と重ねて描く:}
\begin{quote}
このポリマーカー描画ルーチンは折れ線と同時に使用することが多い.
折れ線と同じ様に欠損値の処理もできる.
{\tt SGPLU} では何も描かれなかった欠損値に囲まれた孤立点も,
{\tt SGPMU} では表示される.
\end{quote}
\end{itemize}
\newpage
\Dproginput{sgpack/sgpk04.f}
%============================ SAMPLE 5 =================================
\newpage
\section{V座標系で文字を書く}
\label{sg.sgtxv}
ここでは文字を書く例を示す.
文字の位置は通常「文字列の中心」の座標で指定する.
指定した文字の座標と,
実際に描画される文字の位置関係をわかりやすくするために,
まず補助線を引いてその交点の座標を指定して文字を出力する.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk05_0001.eps}\\
{\bf sgpk05.f:page1}\\
\end{center}
\begin{itemize}
\item {\bf 文字の出力(V座標系):}
\begin{quote}
V座標系で文字を出力するには {\tt SGTXV (SG TeXt V)} を使う.
これは根回し型のルーチンで,
線分描画ルーチンと同じ様に上意下達型の {\tt SGTXZV} もあるが,
機能は全く同じなのでここでは省略する.
\vspace{1em}
まず, ここで注意すべきことは,
文字列の中心が指定した座標になるように出力されることである.
これは後述のパラメータで変更可能である.
また, 文字の高さはデフォルトで0.05であり,
文字のピッチもそれに等しい.
\vspace{1em}
細かいことであるが, ここでいう文字の高さとは,
すべての文字を入れることができる正方形の高さである.
つまり, 小文字の{\tt g}等の様にベースラインよりも下に伸びる文字もあるので,
大文字を書いた場合には下に少し余白が残ることになる.
そのために, 実際の文字の高さは大文字では0.05よりも少し(12-13 \%)小さく,
また, 文字の中心(文字位置を指定する座標)も大文字の実際の中心よりも
心持ち下になる.
\end{quote}
%
\item {\bf 文字の属性を変える:}
\begin{quote}
文字のインデクスを変えるには {\tt SGSTXI (SG Set TeXt Index)} を使う.
このインデクスは線分のインデクスには影響されず,
独立に管理されていることに注意されたい.
\vspace{1em}
また, 文字の大きさは {\tt SGSTXS (SG Set TeXt Size)} によって
変えることができる.
\end{quote}
%
\item {\bf センタリングオプション:}
\begin{quote}
初期状態では{\tt SGTXV}で指定する位置は, 文字列の中心の座標であるが,
文字列の左端の座標や, 右端の座標で指定することもできる.
この指定を変えるには, {\tt SGSTXC (SG Set TeXt Centering option)}を
使う.
\end{quote}
%
\item {\bf 文字の回転:}
\begin{quote}
文字列を回転させるためには{\tt SGSTXR (SG Set TeXt Rotation)} を
用いて指定した位置を中心に反時計回りの角度を指定する.
\end{quote}
\end{itemize}
\Dproginput{sgpack/sgpk05.f}
%============================ SAMPLE 6 =================================
\newpage
\section{U座標系で文字を書く}
\label{sg.sgtxu}
これはU座標系で文字を書くプログラムである.
U座標系での文字の描画も基本的には V座標系空間での描画と同じであるが,
文字の大きさはV座標系で指定するので,
ビューポートの大きさが変わっても文字の大きさは変わらないという点が,
線分描画の場合と異なる.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk06_0001.eps}\\
{\bf sgpk06.f:page1}\\
\end{center}
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk06_0002.eps}\\
{\bf sgpk06.f:page2}\\
\end{center}
\begin{itemize}
\item {\bf 文字の出力(U座標系):}
\begin{quote}
U座標系空間での文字の描画には{\tt SGTXU (SG TeXt U)} を使う.
1ページ目には線画図形との比較のため{\tt SGPLU} で描いた円の中に
文字を出力してある.
\end{quote}
%
\item {\bf ビューポート / ウインドウの変更:}
\begin{quote}
2ページ目の左上に前のページと同じ図形を,ビューポートだけを
小さくして描画した.
ビューポートが小さくなったのに応じて{\tt SGPLU} で描いた円は小さくなるが,
文字の大きさは1ページ目と変わらない.
\vspace{1em}
ウインドウを変えて図形の縦横比を変えた場合(右上)でも文字は不変である.
\end{quote}
%
\item {\bf クリッピング:}
\begin{quote}
クリッピングに関して,文字は線画図形と同じで,
{\tt SGLSET}を用い内部変数{\tt 'LCLIP'}を{\tt .TRUE.}とした指定が文字に
対しても適用される.
\end{quote}
\end{itemize}
\Dproginput{sgpack/sgpk06.f}
%========================== SAMPLE 7 ===================================
\newpage
\section{添字とギリシャ文字}
\label{sg.greek}
これは GRPH1 で出力できるいろいろな文字の例である.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk07_0001.eps}\\
{\bf sgpk07.f:page1}\\
\end{center}
\begin{itemize}
\item {\bf 添字:}
\begin{quote}
GRPH1 においては {\tt | " \_ } の3文字は添字の制御に使われる.
何も指定しなければ, これらの文字も他の文字と同様に文字として出力されるが,
{\tt SGLSET}で内部変数{\tt 'LCNTL'}を{\tt .TRUE.} にすると上付, 下付の
添字を出力することができる.
ここで注意すべきことは, 文字列が添字で終る場合でも,
添字の後に必ず{\tt " }を入れて通常の文字モードに戻すことである.
こうしないと, 文字列の長さが正確に求まらず,
センタリングや右よせ等の処理がうまくいかない.
\vspace{1em}
また, 添字の大きさや上下の移動量は,
それぞれ{\tt SGRSET}で内部変数{\tt 'SMALL'}, {\tt 'SHIFT'}を
指定することにより変更できる.
\end{quote}
%
\item {\bf きれいなフォント:}
\begin{quote}
GRPH1 は2種類のフォントを持っており,
{\tt SGISET}で内部変数{\tt 'IFONT'}を2とすることによって,
フォント番号2の高品位フォントを出力することができる.
この例を見ればわかるように,
高品位フォントは複数の線を引くことで, 線の太さを調節しているため,
ラインインデクスで線の太さを変えられる出力装置の場合には,
太い線を指定すると空白が潰れてそれらしい文字になる.
\vspace{1em}
また, 当然のことながら高品位フォントを使うと出力量が増えるので,
出力に時間がかかるようになる.
\end{quote}
%
\item {\bf ギリシャ文字と特殊記号:}
\begin{quote}
フォントテーブルを見ればわかるように,
GRPH1 は普通のアルファベットだけでなく,
ギリシャ文字や特殊記号のフォントも持っている.
これらを出力するには, フォント番号を文字関数{\tt CSGI} で文字コードに変換し,
それをテキストとして {\tt SGTXV} 等に渡せばよい.
\vspace{1em}
この文字関数 {\tt CSGI} は ASCII コードを使用する計算機では
{\tt CHAR} 関数と同値であり,
これを使っても同じ結果が得られるが,
EBCDIC コードを使用する計算機では{\tt CHAR} 関数で正しい文字が得られない.
\vspace{1em}
従って, {\tt CSGI} を使って文字コードを指定しておけば,
どちらのコードを使用する計算機であっても正しい結果が得られる.
フォント番号に関しては
「GRPH1」マニュアルの付表を参照のこと.
\end{quote}
\end{itemize}
\Dproginput{sgpack/sgpk07.f}
%=========================== SAMPLE 8 ==================================
\newpage
\section{網かけをする}
\label{sg.sgtone}
これは指定した領域に網かけをする例である.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk08_0001.eps}\\
{\bf sgpk08.f:page1}\\
\end{center}
\begin{itemize}
\item {\bf 領域網かけ:}
\begin{quote}
{\tt SGTNU (SG ToNe U)} はU座標系で多角形の内部に網かけをする.
引数の形は {\tt SGPLU} と同じであるが,
{\tt SGTNU} では指定した点列の始点と終点を結んだ多角形の中を塗りつぶす.
(左下)
座標点に関して{\tt SGTNU}に渡したものと同じ引数で折れ線を描いているが,
始点と終点は一致する必要のないことがわかる.
\end{quote}
%
\item {\bf パターンの指定:}
\begin{quote}
{\tt SGTNU} で行う網かけのパターンの指定は
{\tt SGSTNP (SG Set ToNe Pattern)} で指定できる.
例によってパターンを同時に指定するルーチン {\tt SGTNZU} も用意されている.
トーン番号とパターンの対応については,
「GRPH1」マニュアルの付表を参照のこと.
\end{quote}
%
\item {\bf 複雑な多角形:}
\begin{quote}
{\tt SGTNU/SGTNZU} で指定する多角形は単連結領域である必要はない.
右上のように多角形の辺同志が交差する「ねじれた多角形」でも,
その図形によってできる閉領域全てを塗りつぶす.
\end{quote}
\item {\bf ハードフィル / ソフトフィル:}
\begin{quote}
なお, 何も指定しなければ標準的にはハードフィル
(ディバイスに依存した網かけ)を行うようになっている.
しかし,ハードフィルができないようなディバイス, あるいは
{\tt SGLSET} で内部変数 {\tt 'LSOFTF'} を {\tt .TRUE.} にすると,
ソフトフィルによる網かけをおこなう.
ここでは, ハードフィルができないようながデバイスも念頭に置いて,
ソフトフィルを陽に指定した.
\end{quote}
\end{itemize}
\newpage
\Dproginput{sgpack/sgpk08.f}
%=========================== SAMPLE 9 ==================================
\newpage
\section{ラベルつきの折れ線を描く}
\label{sg.sglchr}
ポリラインプリミティブの拡張機能として,
ラベルつきの折れ線を描くこともできる.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk09_0001.eps}\\
{\bf sgpk09.f:page1}\\
\end{center}
\begin{itemize}
\item {\bf ラベルつきの折れ線:}
\begin{quote}
{\tt SG}{\it p}{\tt GET/}{\tt SG}{\it p}{\tt SET}の管理する
内部変数{\tt 'LCHAR'}を
{\tt .TRUE.}にすることによって,ポリラインプリミティブは
ラベルつきの折れ線を描く.
ここでいうラベル付き折れ線とは, 描くべき線分のある長さを1サイクルとして,
その一部分を空白域としその空白部分に指定した文字列を描くものである.
\end{quote}
\item {\bf ラベルの指定:}
\begin{quote}
描く折れ線にはさみこむ文字列は{\tt SGSPLC}
{\tt (SG Set PolyLine Character)}で指定する.
このルーチンによって文字列を指定し,{\tt 'LCHAR'}を{\tt .TRUE.}とし,
{\tt SGPLU}などのポリラインプリミティブを呼ぶと,
描かれる折れ線に{\tt SGSPLC}で指定した文字が一定間隔で描かれる.
注意すべきことは,{\tt 'LCHAR'}の指定は,線分を描くすべてのプリミティ
ブに有効なので,必要な描画が終ったら{\tt 'LCHAR'}を{\tt .FALSE.}に
戻しておかなくてはならない.
\end{quote}
\item {\bf ラベルの変形:}
\begin{quote}
この例のようにラベルの最後の1文字について,その文字番号を
1つずつ増やしたいときは,
{\tt SGNPLC} {\tt (SG Next PolyLine Character)}によって
設定されている文字列の最後の1文字の文字番号を1つふやすことができる.
つまりこの例では文字列として{\tt 'K=1'}が指定されているが,
まず第1回目の呼び出しで{\tt 'K=1'}を描き, 以降
第$i$回目の呼び出しでは{\tt 'K=}{\it i}{\tt '} $( i=1... 4)$が
描かれている.
{\tt SGSPLC}で文字列が設定してない場合の初期値は{\tt 'A'}である.
\end{quote}
\end{itemize}
\newpage
\Dproginput{sgpack/sgpk09.f}
%=========================== SAMPLE 10 ==================================
\newpage
\section{矢印を描く}
\label{sg.sgarrw}
矢印つき線分(線分の終点から対称な2本の線分を付け加える)を
描くサブルーチンも用意されている.
\vspace{1em}
\begin{center}
\Depsf[10cm]{sgpack/sgpk10_0001.eps}\\
{\bf sgpk10.f:page1}\\
\end{center}
\begin{itemize}
\item {\bf アローサブプリミティブ:}
\begin{quote}
アローサブプリミティブはの基本的な構成は,
ラインサブプリミティブとほぼ同じである.
違いは,
ラインサブプリミティブではラインインデクスしか指定しなかったが,
アローサブプリミティブではラインインデクスのほかに
ラインタイプも指定できる.
したがってこの例でも, ラインタイプに関する引数部分を消して{\tt SGLAZU}
{\tt (SG Line-Arrow ZU)}のかわりに{\tt SGLNZU}を呼べば,
矢羽の部分がないだけで同じような線分群を描くことができる.
\end{quote}
\item {\bf 矢じり部分の形状設定:}
\begin{quote}
矢じり部分の形状は
{\tt SG}{\it p}{\tt GET/}{\tt SG}{\it p}{\tt SET}が
管理するいくつかの内部変数によって設定できる.
上段左側の矢印は, デフォルトの内部変数を用いて描いた.
この場合, 線分部分が長くなると, それに比例して矢じりの部分も長くなる.
上段右側の矢印は, 内部変数{\tt 'LPROP'}を{\tt .FALSE.}として描いた.
このようにすると, 矢じり部分の長さが一定値となる.
また下段の矢印は,
矢じり部分の線分と本体部分の線分のなす角(内部変数{\tt 'ANGLE'})
を変化させて描いた.
\end{quote}
\end{itemize}
\newpage
\Dproginput{sgpack/sgpk10.f}
|