プログラム 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 ルーチンで同様に行ないます. しかし, これはアローサブプリミティブの特殊な場合(矢じり部分がない場合) と考えられますので, 将来的には削除されるかも知れません.
      
      
| 
 |