HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0329
七誌画像の拡大11解決


七誌

リンク

2011/3/29(Tue) 11:35:47|NO.37968

マウスを中心に画像を拡大するにはどうしたらよいでしょうか?

imgSize = 200.0 buffer 1,imgSize,imgSize gradf 0,0,imgSize,imgSize,1,$cc6600,$000088 screen 0 x = 50.0 y = 50.0 zoom = 1.0 oldZoom = 1.0 wflg=0 repeat color 255,255,255:boxf wheel = mousew if (wheel > 0): zoom += 0.2: wflg=1 if (wheel < 0): zoom -= 0.2: wflg=1 if (wheel = 0): wflg=0 if (wflg) { mx = double(mousex) my = double(mousey) img_mx = (mx - x) oldZoom = zoom } pos x, y gzoom imgSize * zoom, imgSize * zoom, 1, 0, 0, imgSize, imgSize wait 10 loop



この記事に返信する


hspider

リンク

2011/3/29(Tue) 11:43:31|NO.37969

マウスを中心に拡大したら、表示する原点は移動しますよね?
表示する原点の計算は分かるでしょ。
わからなかったら考えて。


考えても分からないならヒント。
原点とマウスの距離。
拡大したら原点とマウスの距離は伸びる。
斜辺=ルート・・・

義務教育の学年によっては、習っていないかも。
習っていないことをやるには?


学校の授業、算数、数学だけはまじめにやっとけ。どこで必要になるかわからん。



七誌

リンク

2011/3/29(Tue) 12:22:20|NO.37971

すでに比率を求めたり座標を掛けたり試行錯誤した結果上手くいかなかったので解答を求めてやってきました。
どこか見落としがあったのかもしれませんが、帰納的に理解したいので現存のソースを改変して示して頂けると非常に助かります。



SYAM

リンク

2011/3/29(Tue) 12:59:48|NO.37974

・ウインドウ内に静止した元画像を、カーソルを中心として拡大する
・ウインドウ内で中心がマウスカーソルの位置になるように画像を移動しつつ、そこを中心として拡大する

どっちでしょう?



七誌

リンク

2011/3/29(Tue) 13:15:01|NO.37977

前者になります。
マウスカーソルが拡大後も画像の同じ位置を触れているようにしたいです。



SYAM

リンク

2011/3/29(Tue) 14:02:52|NO.37985

では、考え方からまず変えてしまいましょう。
元画像を拡大して、どこに描くかを考えるのをやめて、
元画像のどの部分を切り取ってきたら望む画像になっているのかを考えます。


imgSize = 200.0 screen 0,imgSize,imgSize repeat 16:cx=cnt:repeat 16:pos cnt*16,cx*16:mes "猫":loop:loop buffer 1,imgSize,imgSize gcopy 0,0,0,imgSize,imgSize screen 2,imgSize,imgSize gcopy 0,0,0,imgSize,imgSize zoom = 1.0 wflg=0 gsel 0 repeat wheel = mousew if (wheel > 0): zoom += 0.2: wflg=1 if (wheel < 0): zoom -= 0.2: wflg=1 if (wheel = 0): wflg=0 if (wflg) { title "zoom="+zoom } mx = mousex my = mousey srcSize = imgSize/zoom ; 切り出し元のサイズ. srcPosX = (imgSize-srcSize)*mousex/imgSize ; 切り出し元の位置. srcPosY = (imgSize-srcSize)*mousey/imgSize gsel 2 redraw 0 pos 0,0 : gcopy 1,0,0,imgSize,imgSize color 0,0,255:boxf srcPosX , srcPosY , srcPosX+srcSize,srcPosY+srcSize color 0,255,255:pset mx,my redraw 1 gsel 0 redraw 0 color 255,255,255 : boxf pos 0,0 : gzoom imgSize,imgSize, 1, srcPosX , srcPosY , srcSize,srcSize,1 redraw 1 wait 10 loop

勝手に追加した screen 2のウインドウは、元画像のどの部分をscreen 0にコピーしているのかを青で示しています。
水色の点は、カーソル位置です。
なんとなくどんな法則で動いているのか見えてきますよね。

計算式はチョイとややこしそうに見えますが、screen 2の動きと見比べればそんなにムズかしいことでないとは思います。がんばって。



七誌

リンク

2011/3/29(Tue) 22:11:46|NO.38002

すみません、寝過ごしてしまいました。
どの値がどのように関与しているかはおぼろげながら理解できました。
ですが、ちなみにもう一つの拡大後の座標を求める方法も教えていただけませんか?
画像に他の処理も加える場合はそちらの方がよりシンプルに実装できる気がしますので。



SYAM

リンク

2011/3/30(Wed) 10:04:31|NO.38014

リクツとしては、
今やろうとしていることを抽象的に表現すると、
「画面Aのどの領域が画面Bのどの領域と同じ絵になるかを計算する」です。
そうとだけ考えたら、AとBが入れ替わっても処理はまったく一緒のように思えてきませんか?

これも、screen 2のウインドウで青が描かれてるエリアがヒントになります。
青のエリアを貼り付け先として、gzoomで画像を貼ってみてください。
先のサンプルで、screen 0 はそのままにして screen 2 の描画部分を書き換えるのがオススメ。間違ってなければ、2つの画面は、先のリクツでいう AとBが入れ替わったもの になるはずです。
動かして見比べれば、どう違っててどう直せばいいかすぐにわかるでしょう。



SYAM

リンク

2011/3/30(Wed) 10:31:00|NO.38015

追記。

mx = double(mousex) my = double(mousey) srcSize = imgSize*zoom ; 切り出し元のサイズ. srcPosX = mx - mx * zoom ; 切り出し元の位置. srcPosY = my - my * zoom ; 切り出し元の位置.
整理すると、座標は「元画像のカーソル位置」「拡大縮小率」だけで決まってるのがわかります。
なので、どんな画面からどんな画面への変換なのかということには影響をうけず、同じ計算でできてしまうってわけです。



七誌

リンク

2011/3/31(Thu) 22:08:54|NO.38037

紛らわしい言葉遣いをしてしまい申し訳ございません。
「もう一つの方法」とは”元画像を拡大後表示位置を変更する”という方法を指したつもりで書かせていただきました。
掲示していただいたサンプルスクリプトの方はお陰様で両方とも理解できました。



SYAM

リンク

2011/3/31(Thu) 23:03:42|NO.38038

38014は、拡大画像のほうを位置指定して貼ってることになるはずです。

…あれ、私はなにかまだ勘違いしている?



七誌

リンク

2011/3/31(Thu) 23:58:13|NO.38044

どうやら私が見当違いしていたようです。幾度となく申し訳ございません。
今しがた解決いたしました。
今まで丁寧かつ親切な回答を本当にありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.