3.4 アローとラインのサブプリミティブ

出力プリミティブには, ポリライン・ポリマーカー・テキスト・トーンの他に, 補助的にアロー(矢印)とライン(線分)のサブプリミティブがあります. アロー サブプリミティブには, 矢印の軸部分のラインインデクスとラインタイプの2 つの属性があり, ラインサブプリミティブにはラインインデクスの属性があり ます.

プログラム KIHONC で, いろいろな矢印や線分を描いてみましょう. U-座標系での矢印描画は, Arrow.draw メソッドで行ないます. 引数は, (X1,Y1) が始点の座標, (X2,Y2) が終点の座標です. 線分の終点から 対称な2本の線分を付け加えて矢じり部分とします. 最初の例のように, デフォ ルトでは, 本体部分が長くなるのに比例して矢じり部分も大きくなります.

 #
# kihonc.rb


require "narray"
require "numru/advanceddcl"
include NumRu::AdvancedDCL
include NMath


#-- graph ---
Dev.open

Frame.new

Fig.window=[0.0, 10.0, 0.0, 10.0]
Fig.viewport=[0.0, 1.0, 0.0, 1.0]
Fig.transnum=1

#-- デフォルト ----
y1 = 9.0
for i in 1..8
  x1 = i
  x2 = x1 + 0.1*i
  y2 = y1 + 0.1*i
  Arrow.draw(x1, y1, x2, y2)
end

#-- 線分のラインタイプ ----
y1 = 8.0
y2 = 8.6
for i in 1..4
  x1 = 2*i - 1
  x2 = x1 + 0.6
  Arrow.draw(x1, y1, x2, y2, "arrowtype"=>i)
end

#-- 線分のラインインデクス ----
y1 = 7.0
y2 = 7.6
for i in 1..4
  x1 = 2*i
  x2 = x1 + 0.6
  Arrow.draw(x1, y1, x2, y2, "arrowindex"=>i)
end

#-- 矢じり部分の長さ ----
Arrow.lprop= false
Arrow.const= 0.03

y1 = 6.0
for i in 1..8
  x1 = i
  x2 = x1 + 0.1*i
  y2 = y1 + 0.1*i
  Arrow.draw(x1, y1, x2, y2)
end

Arrow.lprop= true

#-- 矢じり部分の角度 ----
y1 = 5.0
y2 = 5.6
for i in 1..8
  x1 = i
  x2 = x1 + 0.6
  Arrow.draw(x1, y1, x2, y2, "angle"=>10.0*i)
end

#-- 矢じり部分のぬりつぶし ----
Tone.lsoftf=true
Arrow.latone= true
Arrow.iatone= 655

y1 = 4.0
y2 = 4.6
for i in 1..8
  x1 = i
  x2 = x1 + 0.6
  Arrow.draw(x1, y1, x2, y2, "angle"=>10.0*i)
end

#-- ラインサブプリミティブ ----
#-- デフォルト ----
Plot.draw([0.0, 10.0], [3.0, 3.0])

#-- 線分のラインインデクス ----
y1 = 0.5
y2 = 2.5
for i in 1..4
  x1 = 2*i - 1
  x2 = x1 + 2.0
  Plot.draw([x1, x2], [y1, y2], "lineindex"=>i)
end

Dev.close

PROGRAM KIHONC

 

\resizebox{!}{10cm}{\includegraphics{kihon2/kihonc.eps}}
kihonc.rb: frame1

パラメタarrowtype ルーチンでは矢印を描く線分のラインタイプを, arrowindex ではそのラインインデクスを設定できます(2番めと3番め). また,ア ローサブプリミティブに関する内部変数を設定し直すことにより, 矢じり部分 の形状を変えることもできます. 4番めの例では, パラメタ lprop.FALSE. として矢じり部分の長さが一定値となるようにし, その長さを パラメタconst で陽に与えました. さらに, 矢じり部分の線分と本 体部分の線分のなす角を変化させたり(5番め), 矢じり部分を定義する三角形 の領域を塗りつぶしたり(6番め)することにより, 多種多様な矢印が可能です.

最後に, U-座標系での線分描画は, Plot.draw ルーチンで同様に行ないます.