[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:002059] Re: GGraph and gpview



竹広さん 

> > > > (1) やはり unless opts['itr']==5 then ... のように相似変換と
> > > >     itr==5 を同一視するコーディングは変えた方がいいと思います。
> > 
> > ここに関連する fig 内の itr によるスイッチング部分については、
> > かなり変えた方がいいと思います('window' の使い方と 'window'省略
> > 時の挙動を変えたい)。私がたたき台を作ってみますので、テストお願
> > いできますか。
> 
> わかりました. テストぐらいの仕事は大丈夫です. 

fig の該当部分を作ってみました。差分を末尾に付けます。
(全体は dennou-k の私のホームに置きました。そのうち
消します。)

竹広さんのテストプログラムで結果が同じであることは
確認しました。また新たに、

  # 子午面断面 2
  if defined?(DCL::DCLVERSION) && DCL::DCLVERSION >= '5.3'
    gp = gphys.cut('lon'=>0.0,'t'=>0.0 )
    p gp.coord(1).val
    GGraph.set_fig('itr'=>5)
    GGraph.next_fig('window'=>[-0.7,1.7,-1.2,1.2])
    GGraph.tone( gp, true, {'transpose'=>true} )
    GGraph.contour( gp, false, {'transpose'=>true} )
  end

というテストを加え、'window' を指定した場合のテストをしてみまし
た(「# 子午面循環」の次にこれを加えてみてください。但し後述する
ように DCL 5.3 以上限定です)。一応変換番号 5,6 に対応することし
ましたが、6 はお任せメニューは作っておらず、陽に 'similar' か 
'window' を呼ばないとなりません。6 はテストもしてないですが、対
応すべき場所をはっきりさせることで、今後の開発に備えてます。
(なお 7 は DCL 5.3 でも未実装のままでした)

上記の新テストのように 'similar' を指定せず、'window' を指定した
場合、直交曲線座標等からの変換先の直交座標における4隅の指定とし
て扱います。r,θ -> x,y なら x,y に関する4隅です。これを 
viewport の端に対応させます。ただし、実際には自由度を4から3に
落さないとならいので、適当にあしらわれます(スケールファクターは
横軸の縮尺のみから決まる)。これは DCL 5.3 の機能 (DCL::sgscwd) 
を使ってますので、そうでない場合は例外が出ます。なお、sgscwd は 
itr=51 と同時に導入されました。こちらも ggraph で対応したいです。

堀之内


--- ggraph_takepiro_rev.rb      2005-01-25 11:40:40.000000000 +0900
+++ ggraph.rb   2005-01-25 20:53:46.000000000 +0900
@@ -226,7 +226,7 @@
                              # condition is satisfied (nil:never, true:always,
                              # String: when an attibute has the value specified
                              # ("key:value,key:value,..")
-       "similar"'    nil     # (for rectangular curvilinear coordinate only)
+       "similar"    nil     # (for rectangular curvilinear coordinate only)
                             # 3-element float array for similar transformation
                              # in a rectangular curvilinear coordinate, which 
                             # is fed in DCL:grssim:[simfac,vxoff,vyoff],where 
@@ -2093,7 +2093,7 @@
       DCL.grstrn(opts['itr'])
 
       case opts['itr']
-      when 1..9,51..99
+      when 1..4,51..99
         # all but for map projection
 
         raise(ArgumentError, "xax and yax must be provided") if !xax or !yax
@@ -2129,19 +2129,29 @@
         else
           window=opts['window']
         end
+        DCL.grswnd(*window)
 
-       unless opts['itr']==5 then
-         DCL.grswnd(*window)
-       else
-          if ! opts['similar'] 
-           vxmin,vxmax,vymin,vymax=DCL.sgqvpt
-            simfac = (vymax-vymin)/(xrange[1]*2)
-           similar = [simfac,0.0,0.0]
-         else
+      when 5,6
+          if opts['similar'] 
            similar=opts['similar'] 
+           DCL.grssim(*similar)
+         elsif opts['window'] 
+           if defined?(DCL::DCLVERSION) && DCL::DCLVERSION >= '5.3'
+             DCL.sgscwd(*opts['window'])
+           else
+             raise "You need DCL 5.3 or later to use the 'window' parameter in this transform (#{opts['itr']}). Use 'similar' instead."
+           end
+         else
+           case opts['itr']
+           when 5
+             vxmin,vxmax,vymin,vymax=DCL.sgqvpt
+             simfac = (vymax-vymin)/(xax.max*2)    # only xax is used
+             similar = [simfac,0.0,0.0]
+             DCL.grssim(*similar)
+           else
+             raise NotImplementedError, "Sorry, automatic window setting is yet to be available for the transform #{opts['itr']}. Please specify the 'similar' or 'window' parameter"
+           end
          end
-          DCL.grssim(*similar)
-       end
 
       when 10..15 
         map_axis = opts['map_axis'] || [180.0, 0.0, 0.0]