[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:002059] Re: GGraph and gpview
- To: dennou-ruby@xxxxxxxxxxx
- Subject: [dennou-ruby:002059] Re: GGraph and gpview
- From: Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxxx>
- Date: Tue, 25 Jan 2005 21:03:23 +0900
竹広さん
> > > > (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]