DCL:らくらくDCL:描画の基本(2):ユーザー座標系(U-座標系)での基本描画
次のプログラム kihon7 では, U-座標系でのポリラインやテキストプリ ミティブの出力結果が, ウインドウとビューポートの設定の仕方によってどの ようになるかを示しましょう.
# kihon7.rb
require "narray"
require "numru/dcl"
include NumRu
include Math
def aplot
  nmax = 40
  x = NArray.sfloat(nmax+1)
  y = NArray.sfloat(nmax+1)
  DCL::slpvpr(1)
  #-- circle ----
  dt = 2.0*PI/nmax
  for n in 0..nmax
    x[n] = 40.0*sin(n*dt)
    y[n] = 40.0*cos(n*dt)
  end
  DCL::sgplu(x, y)
  #-- triangle ----
  dt = 2.0*PI/3
  for n in 0..3
    x[n] = 40.0*sin(n*dt)
    y[n] = 40.0*cos(n*dt)
  end
  DCL::sgplu(x, y)
  #-- string ----
  DCL::sgtxu(0.0, 0.0, 'SGTXU')
end
#-- graph ----
iws = (ARGV[0] || (puts ' WORKSTATION ID (I)  ? ;'; DCL::sgpwsn; gets)).to_i
DCL::sgopn iws
#sglset('LCLIP', true)
#-- frame 1 ----
DCL::sgfrm
#        xmin,  xmax,   ymin,  ymax
DCL::sgswnd(-100.0, 100.0, -100.0, 100.0)
DCL::sgsvpt(   0.0,   1.0,    0.0,   1.0)
DCL::sgstrn(1)
DCL::sgstrf
aplot
#-- frame 2 ----
DCL::sgfrm
#-- upper left ----
#        xmin,  xmax,   ymin,  ymax
DCL::sgswnd(-100.0, 100.0, -100.0, 100.0)
DCL::sgsvpt(   0.1,   0.4,    0.6,   0.9)
DCL::sgstrn(1)
DCL::sgstrf
aplot
#-- upper right ----
#        xmin,  xmax,   ymin,  ymax
DCL::sgswnd(-100.0, 100.0,  -40.0,  40.0)
DCL::sgsvpt(   0.6,   0.9,    0.6,   0.9)
DCL::sgstrn(1)
DCL::sgstrf
aplot
#-- lower left ----
#        xmin,  xmax,   ymin,  ymax
DCL::sgswnd(-100.0, 100.0, -200.0,   0.0)
DCL::sgsvpt(   0.1,   0.4,    0.1,   0.4)
DCL::sgstrn(1)
DCL::sgstrf
aplot
      
#-- lower right ----
#        xmin,  xmax,   ymin,   ymax
DCL::sgswnd(-100.0, 100.0,    0.0, -200.0)
DCL::sgsvpt(   0.6,   0.9,    0.1,   0.4)
DCL::sgstrn(1)
DCL::sgstrf
aplot
DCL::sgcls
  
PROGRAM KIHON7
 
 
 
 
 
1フレームめが基本形で, まず slpvpr ルーチンでビューポートの枠を  
描き, U-座標系描画ルーチンの sgplu で円と正三角形を描き, sgtxu で文字列 'sgtxu' を描いています(メソッド(元サブルーチン) aplot).  
  
  
  
  
2フレームめの左上には, 同じ aplot メソッド(元サブルーチン)でビューポートだけ  
を小さくして描いてみました. ビューポートが小さくなったのに対応して   
sgplu で描いた円と三角形は小さくなりましたが, 文字の大きさは1フ  
レームめと変わりません.  U-座標系でのテキストプリミティブでも, 文字の  
大きさはV-座標系の単位で指定するので, ビューポートの大きさが変わっても  
文字の大きさは変わらないのです.  
  
  
  
  
次に, ウインドウのy軸の範囲を変えてみました(右上). 範囲を40%に狭め  
たので, 図形は縦に引き延ばされて, 円が楕円になりました. この場合にも,   
文字は変わりません.  
  
  
  
  
左下の例では, ウインドウの縦横比を元に戻して, uymin=-200, uymax=0 と y軸負方向に平行移動させました. その結果, 設定したビュー  
ポートをはみ出して図形を描いています.  
  
  
  
  
最後に, 右下の例はウインドウのy軸を逆転させた場合です.  
uymin=0, uymax=-200 として, 左下の場合と逆にしました. この  
時の三角形を見れば明らかなように, 図形は上下に折り返されています. ただ  
し, 文字列は正立のままで折り返されません.  
  
  
  
下の2つの例のように, 設定したビューポートをはみ出して図形を描く場合, はみ出した部分を描かないようにすることも出来ます. sglset ルーチ ンを用いてクリッピングに関する内部変数 'LCLIP' を.true. に してやると, ビューポートをはみ出した部分はラインでも文字でも描かれませ ん. 8行めのコメント行をもとに戻せばクリッピングを行ないます.