プログラム kihonc で, いろいろな矢印や線分を描いてみましょう. U-座標系での矢印描画は, sglau ルーチンで行ないます. 引数は, (X1,Y1) が始点の座標, (X2,Y2) が終点の座標です. 線分の終点から 対称な2本の線分を付け加えて矢じり部分とします. 最初の例のように, デフォ ルトでは, 本体部分が長くなるのに比例して矢じり部分も大きくなります.
# kihonc.rb require "narray" require "numru/dcl" include NumRu include Math #-- graph --- iws = (ARGV[0] || (puts ' WORKSTATION ID (I) ? ;'; DCL::sgpwsn; gets)).to_i DCL::sgopn iws DCL::sgfrm DCL::sgswnd(0.0, 10.0, 0.0, 10.0) DCL::sgsvpt(0.0, 1.0, 0.0, 1.0) DCL::sgstrn(1) DCL::sgstrf #-- デフォルト ---- y1 = 9.0 for i in 1..8 x1 = i x2 = x1 + 0.1*i y2 = y1 + 0.1*i DCL::sglau(x1, y1, x2, y2) end #-- 線分のラインタイプ ---- y1 = 8.0 y2 = 8.6 for i in 1..4 x1 = 2*i - 1 x2 = x1 + 0.6 DCL::sgslat(i) DCL::sglau(x1, y1, x2, y2) end DCL::sgslat(1) #-- 線分のラインインデクス ---- y1 = 7.0 y2 = 7.6 for i in 1..4 x1 = 2*i x2 = x1 + 0.6 DCL::sgslai(i) DCL::sglau(x1, y1, x2, y2) end DCL::sgslai(1) #-- 矢じり部分の長さ ---- DCL::sglset('LPROP', false) DCL::sgrset('CONST', 0.03) y1 = 6.0 for i in 1..8 x1 = i x2 = x1 + 0.1*i y2 = y1 + 0.1*i DCL::sglau(x1, y1, x2, y2) end DCL::sglset('LPROP', true) #-- 矢じり部分の角度 ---- y1 = 5.0 y2 = 5.6 for i in 1..8 x1 = i x2 = x1 + 0.6 DCL::sgrset('ANGLE', 10.0*i) DCL::sglau(x1, y1, x2, y2) end #-- 矢じり部分のぬりつぶし ---- DCL::sglset('LSOFTF', true) DCL::sglset('LATONE', true) DCL::sgiset('IATONE', 655) y1 = 4.0 y2 = 4.6 for i in 1..8 x1 = i x2 = x1 + 0.6 DCL::sgrset('ANGLE', 10.*i) DCL::sglau(x1, y1, x2, y2) end #-- ラインサブプリミティブ ---- #-- デフォルト ---- DCL::sglnu(0.0, 3.0, 10.0, 3.0) #-- 線分のラインインデクス ---- y1 = 0.5 y2 = 2.5 for i in 1..4 x1 = 2*i - 1 x2 = x1 + 2.0 DCL::sgslni(i) DCL::sglnu(x1, y1, x2, y2) end DCL::sgcls
sgslat ルーチンでは矢印を描く線分のラインタイプを, sgslai
ルーチンではそのラインインデクスを設定できます(2番めと3番め). また,ア
ローサブプリミティブに関する内部変数を設定し直すことにより, 矢じり部分
の形状を変えることもできます. 4番めの例では, 内部変数 'LPROP' を
.false. として矢じり部分の長さが一定値となるようにし, その長さを
内部変数 'CONST' で陽に与えました. さらに, 矢じり部分の線分と本
体部分の線分のなす角を変化させたり(5番め), 矢じり部分を定義する三角形
の領域を塗りつぶしたり(6番め)することにより, 多種多様な矢印が可能です.
最後に, U-座標系での線分描画は, sglnu ルーチンで同様に行ないます. しかし, これはアローサブプリミティブの特殊な場合(矢じり部分がない場合) と考えられますので, 将来的には削除されるかも知れません.
|