Transforming mouse coordinates
Monkey Forums/Monkey Programming/Transforming mouse coordinates
| ||
| Hi all, I'm stuck with the following problem. Assume an image which is rotated, scaled, shifted and displayed that way (the image is centered, so 0,0 are the center coordinates of the image): PushMatrix() Translate( x, y ) Rotate( angle ) Scale( s, s ) DrawImage( img, 0, 0 ) Now I would like to know if the mouse pointer is above that image rectangle or not. For that I need to transform the mouse coordinates to the local space of that image. I know the transform_mouse example from warpy already even though I still have an error in my code... |
| ||
| . sorry double posts! |
| ||
Please forgive my stupidness, but out of warpy's example I try the following:
Import mojo
Class TestApp Extends App
Field tmx:Float
Field tmy:Float
Method OnCreate()
SetUpdateRate 60
End
Method OnUpdate()
End
Method OnRender()
Cls
SetColor 255,255,255
SetFont Null
PushMatrix()
Translate 100, 100
Rotate 45
DrawRect( -25, -25, 50, 50 ) 'This is the same as drawing an image using DrawImage( img, 0, 0 )
Local coords#[]
'get the mouse's screen co-ordinates
Local mx# = MouseX()
Local my# = MouseY()
Local m#[] = GetMatrix()
'OK, how am I supposed to transform the mouse coordinates so they show 0,0 in the centre of that rectangle?
'I'd say first I push the matrix onto the stack:
PushMatrix
'Now I shift the mouse coordinates
Translate( mx, my )
'I apply the same rotation
Rotate( 45 )
'And I transform that with the previous matrix I got
Transform( m[0], m[1], m[2], m[3], m[4], m[5] )
'Now I have to use the inverse transformation to get the mouse coords in the local space
coords = InvTransform( [ mx, my ] )
tmx = coords[0]
tmy = coords[1]
PopMatrix
PopMatrix
DrawText( "x: " + tmx, 10, 10 )
DrawText( "y: " + tmy, 10, 30 )
End
End
Function Main()
New TestApp()
End
So the middle of that rectangle should be something like 0, 0 in mouse coordinates (transformed tmx and tmy) but today is not my math day. So how am I supposed to transform the mouse coordinates so they show 0,0 in the centre of that rectangle? |
| ||
| I think this code by NoOdle does what you need... |
| ||
| Well indeed, thanks for that! But it's a bit of an overkill for what I need so I'll keep trying. Maybe warpy has an idea of what's going wrong with my code or I just reactivate my rusty math knowledge... |
| ||
Ok, here's the solution, pretty simple:
Import mojo
Class TestApp Extends App
Field _tmx:Float
Field _tmy:Float
Field _mat:Float[]
Field _mx:Float
Field _my:Float
Method OnCreate()
SetUpdateRate( 30 )
End
Method OnUpdate()
End
Method OnRender()
Cls()
PushMatrix()
Translate( 200, 200 )
Rotate( 30 )
DrawRect( -25, -25, 50, 50 )
'get the mouse screen coordinates
_mx = MouseX()
_my = MouseY()
_mat = GetMatrix()
PopMatrix()
PushMatrix()
'Apply the last saved mapMatrix, that is, all rotations, scalings and translations applied since the program started
Transform( _mat[0], _mat[1], _mat[2], _mat[3], _mat[4], _mat[5] )
'Work out what coordinate the mouse is pointing at by doing the matrix transformation backwards.
Local coords:Float[] = InvTransform( [ _mx, _my ] )
_tmx = coords[0]
_tmy = coords[1]
PopMatrix()
DrawText( "mx: " + _mx, 10, 10 )
DrawText( "my: " + _my, 10, 30 )
DrawText( "tmx: " + _tmx, 10, 50 )
DrawText( "tmy: " + _tmy, 10, 70 )
End
End
Function Main()
New TestApp()
End
|