views:

110

answers:

2

Some math calculations in JS problem solving

I am working on a zoom image functionality that creates a new div with a large image that is moved through x and y according to the mousemove on the image.

The large image should move a certain %, which is what i am trying to figure out. How much should it move by.

Here is some info:

  • The small image is always the same size and its square. (it is actually always 221px X 221px)
  • The large image varies (also always square, can be any size like 1000x1000)
  • The view port of the zoomer is always the same.

I want to calculate how much smaller (or vice-versa ) the small image is from the the large.

This is in middle of a whole big script. I started writing the formula for the calculation: Again, All i want is to get the difference in percent converted into pixels step by step. First get the % then convert that into pixels.

    zoomObj.caluculateSizes = function(){
        $(zoomObj.largeImage).load(function(){
            // zoomObj.callingEvent is the small image
           zoomObj.smlImgSize = zoomObj.callingEvent.width()
           zoomObj.lrgImgSize = zoomObj.largeImage.width()

           // How do i go from here?
    })

js goes on.......

+1  A: 

Unless I am mistaken this is more a mathematical question than a jQuery one. To get the percentage, divide one by the other and multiply by 100.

So, to get the with of the small image as a percentage of the width of the big image:

var smallImgWidthPercentage = parseFloat(zoomObj.callingEvent.width() / zoomObj.largeImage.width()) * 100;

Although, if your image is square, then you only need to work out one value.

James Wiseman
Correct, I only need to work out one value.
adardesign
+1  A: 

This is just bit of simple math...

w - width of the small image
W - width of the big image
l - left position of the small image
L - left position of the big image

L = l + 1/2w - 1/2W

h - height of the small image
H - height of the big image
t - top position of the small image
T - top position of the big image

T = t + 1/2h - 1/2H

So assuming our image is:

<img style="width:221px; height:221px; position:absolute; left:600px; top:700px;" />

Answer:

Left = 600 + 1/2*221 - 1/2*1000 = 210 (rounded)
Top = 700 + 1/2*221 - 1/2*1000 = 310 (rounded)

<img style="width:1000px; height:1000px; position:absolute; left:210px; top:310px;" />

Using this calculation you can determine where you need to place big image/div to be centred in relation to the other object.


Edit: To put it all together, assuming bigImage is a CHILD of viewport, you need to use 0 as t and 0 as l.

Left = 0 + 1/2*221 - 1/2*1000 = -390 (rounded)
Top = 0 + 1/2*221 - 1/2*1000 = -390 (rounded)

<div id="viewport" style="width:221px; height:221px;overflow:hidden;position:relative;">
    <img id="bigImage" style="width:1000px; height:1000px; position:absolute; left:-390px; top:-390px;" />
</div>

- as you see I used negative values, so bigImage will hide behind the viewport, and because.

rochal
Ok, I got what you answered.. But to refine my question. the large image is inside a div that has a overflow hidden so the image inside is going to be moved X and Y to reveal the part that should be zoomed, The small image is not positioned its positioned static. the zoomer is
adardesign
same thing - just instead of positive left/top, use negative values. Make sure you 'viewport' has postion:relative set and then internal 'large-image-div' will calculate its position relatively from the position of viewport.
rochal
Ok, sorry for asking, but i should be clear, would you please mind to edit the answer accordingly? Thanks much
adardesign
done. Note I had to recalculate correct position, as this time our t and l changed.
rochal
Got it, Thanks much, btw thanks for your blog, I found some interesting stuff there
adardesign
cool, no worries, I'm glad you like it :)
rochal