Map
From Director Online Wiki
The map() function scales and stretches a source rect so that it fits exactly over a target rect. The position (and dimensions) of a given point or rect are then calculated with respect to the new shape, size and position of the target rect.
Like all rect methods, map() produces an output in integers. If the target rect is smaller than the source rect, precision is irrevocably lost. If you need to be able to inverse the mapping operation, you need to use a method which produces an output in floating point numbers:
on mMap(aPointOrRect, aSourceRect, aTargetRect) ---------------------- -- INPUT: <aPointOrRect> must be a point or a rect -- <aSourceRect> must be a rect -- <aTargetRect> must be a rect -- OUTPUT: Returns a point or rect with floating point values, which -- has the same relative position with respect to -- aTargetRect as aPointOrRect has to aSourceRect: -- -- ------ ------------------- -- | x| | | -- ------ | X | -- source | | -- ------------------- -- target -- -- x = input aPointOrRect -- X = output -- -- NOTE: The built-in map() function returns values rounded to the -- nearest integer, so the output will not necessarily map -- back to the input. This method is much more accurate. -------------------------------------------------------------------- vHScale = aTargetRect.width / float(aSourceRect.width) vVScale = aTargetRect.height / float(aSourceRect.height) case ilk(aPointOrRect) of #point: vHLoc = aPointOrRect.locH - aSourceRect.left vHLoc = (vHLoc * vHScale) + aTargetRect.left vVLoc = aPointOrRect.locV - aSourceRect.top vVLoc = (vVLoc * vVScale) + aTargetRect.top aPointOrRect = point(vHLoc, vVLoc) #rect: vSourceLeft = aSourceRect.left vTargetLeft = aTargetRect.left vSourceTop = aSourceRect.top vTargetTop = aTargetRect.top vLeft = aPointOrRect.left - vSourceLeft vLeft = (vLeft * vHScale) + vTargetLeft vRight = aPointOrRect.right - vSourceLeft vRight = (vRight * vHScale) + vTargetLeft vTop = aPointOrRect.top - vSourceTop vTop = (vTop * vVScale) + vTargetTop vBottom = aPointOrRect.bottom - vSourceTop vBottom = (vBottom * vVScale) + vTargetTop aPointOrRect = rect(vLeft, vTop, vRight, vBottom) end case return aPointOrRect end mMap