[#42454] 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...>

出沢です

22 messages 2006/06/22
[#42455] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/22

From: しん <dezawa@aliadne.net>

[#42456] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です

[#42458] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/23

From: しん <dezawa@aliadne.net>

[#42459] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です

[#42460] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — rubikitch <rubikitch@...> 2006/06/23

From: しん <dezawa@aliadne.net>

[#42461] Re: 多量の正規表現との効率的なマッチのアイデアを、、 — しん <dezawa@...> 2006/06/23

出沢です。

[ruby-list:42356] Re: TkCanvasの座標

From: Hidetoshi NAGAI <nagai@...>
Date: 2006-06-03 16:47:39 UTC
List: ruby-list #42356
永井@知能.九工大です.

From: Masato Ishimoto <i@coo.net>
Subject: [ruby-list:42355] TkCanvasの座標
Date: Sat, 3 Jun 2006 02:24:26 +0900
Message-ID: <384C309E-92F4-430B-B2A9-0ECEA5DBE629@coo.net>
> MacOSX10.4+Ruby1.8.2環境下で、マウスカーソル(tcross)で
> キャンバスのX、Y座標を取得するプログラムを作っていま 
> す。
> 2点ほど気になりましたので質問させてください。

確かに分かりづらい部分かもしれません.
ご承知のことかもしれませんが,説明するに当り,まずは確認事項です.
キャンバスウィジェットが管理する領域の大きさは
メモリが許す限り広大なものにできます.
画面の表示は,その広大な領域の一部を覗き見ていると考えてください.
ここではその部分を「窓」と読んでおきます.

> 1.キャンバスの大きさ(と表示範囲)が指定したものと違う。
> 
>  プログラムでは200x200のキャンバスを生成し、その4辺
> ギリギリにそれぞれ一本ずつと、各辺を2等分する線を引いて
> います。(6本の線で4つの正方形ができている状態)
>  ・・・はずなのですが、まず、キャンバスのサイズが206x206
> になっています。さらに、表示範囲(?)がずれているのか、左
> と上にあるはずの線が表示されません。これは、こういうものなの
> でしょうか?それとも私が何か勘違いしているだけでしょうか?

キャンバスの窓サイズは 200x200 になっています.
canvas.width, canvas.height が返すのは,この窓サイズです.

ですが,キャンバスウィジェット自体のサイズは,
窓サイズに加えて borderwidth, highlightthickness, 
selectborderwidth といった要素が加わって決定されています.
これらまで含めて,現在,画面上で表示されているキャンバスウィジェットの
大きさは canvas.winfo_width, canvas.winfo_height で得られます.
いしもとさんの現状では,多分,この値が 206x206 になっているのでしょう.

線が表示されない件については,座標 (0,0) から (200, 200) の場合,
幅と高さは 201x201 である点が理由の一つです.
キャンバスの scrollregion (窓を動かす範囲) が設定されていませんから
最後に描画されたアイテムの終点側の (200, 200) が優先されて
窓位置が選ばれたのかもしれません (この点については確信がありません).
多分,窓位置は (1, 1) -- (200, 200) になっているのでしょう.
こうして考えてみますと,

  canvas.width  = 201
  canvas.height = 201
  canvas.scrollregion = [0, 0, 200, 200]

と設定すべきであろうということになります.

さて,キャンバスと窓との関係を考えると,
次の問題も原因が想像できるかもしれません.

> 2.生成したline同士の交点とそれを指したカーソルの座標が違 
> う。
> 
>  キャンバスで交差している点にカーソルを合わせると、Y座標が
> 1小さい値が表示される気がします。例えば、下記プログラムで
> はキャンバス中央の交点は100,100だと思うのですが、カーソルで
> は100,99となります。これは何故なのでしょうか?カーソルの問題
> ?キャンバスの問題?それとも私の問題?

いしもとさんが表示していたのはキャンバス上の座標ではありません.

イベント情報として得られる %x, %y は,
ウィジェットの左上角を (0,0) としたときの座標であることに
注意してください.
この場合,relief 部分 (borderwidth に依存) も含まれます.
つまりは,%x, %y はキャンバス上の座標を直接には示していません.
これは,キャンバスと窓との関係を考えていただければ分かるでしょう.

キャンバス上の座標は,%x, %y の情報から求めてやる必要があります.
x, y で %x, %y の情報を受け取っているなら,キャンバス上の座標は 

   canvas.canvasx(x)
   canvas.canvasy(y)

で得られます (実数値が返されます).

というわけで,修正したコード(部分)はこんな感じでしょうか?
------------------------------------------
         :
         :
canvas = TkCanvas.new(root,
                      'bg' => 'pink',
                      'height' => 201,
                      'width' => 201,
                      'scrollregion' => [0,0,200,200],
                      'cursor' => 'tcross'
                     ).pack('side' => 'top')
         :
         :
canvas.bind('Motion',
             proc{|x, y| enx.text=xp=canvas.canvasx(x)
                  eny.text=xp=canvas.canvasy(y)
                  },'%x %y' )
         :
         :
------------------------------------------

>  気になって夜も眠れません。アドバイスいただければ幸いです。

これでゆっくりとお休みすることができましたら幸いです.(^_^)
-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai@ai.kyutech.ac.jp

In This Thread