では、考え方からまず変えてしまいましょう。
元画像を拡大して、どこに描くかを考えるのをやめて、
元画像のどの部分を切り取ってきたら望む画像になっているのかを考えます。
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の動きと見比べればそんなにムズかしいことでないとは思います。がんばって。