How to obtain pixel X and Y position after panning the bitmap around on the screen?

Started by
4 comments, last by tom_mai78101 10 years ago

I know that you can get the pixel's position with the following algorithm:

y * bitmapWidth + x = pixel position (x, y)

When you pan the bitmap around, I thought you can get the pixel's position by adding the delta differences X, and Y to the original pixel's X and Y position. I later found out this isn't correct. What if I panned the bitmap to the negative X and negative Y axes?

So, I'm kind of stuck here. Anyone knows how to solve this?

Advertisement

It's not clear what you mean by "panning" a bitmap. Can you provide a more complete description of what you're doing?

Are you trying to determine the pixel's position on the screen, or the position within the bitmap?

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

It's not clear what you mean by "panning" a bitmap. Can you provide a more complete description of what you're doing?

Are you trying to determine the pixel's position on the screen, or the position within the bitmap?


The latter: Position within the bitmap using the screen mouse coordinates.

In the editor, the origins is at the top left corner of the drawing area. In the drawing area, there exists a bitmap (a white Canvas, similar to what you will see when you run MS Paint the first time) that is smaller than the drawing area. I can pan (or move) the bitmap around with a Hands tool (similar to Adobe Photoshop's Hand tool, where it moves the entire Canvas to where you wanted to move to). But even when you are panning/moving the bitmap, the origins is still at the top left corner of the drawing area. In other words, the drawing area's X and Y coordinates are not affected by how much you pan/move the bitmap around inside.

Now, I wanted to calculate the position of a pixel within the bitmap, not the position of a pixel on the screen. Now, how do I obtain the position of an arbitrary pixel within the bitmap after the bitmap has been panned/moved around in the drawing area?

Hope this is clear enough.

If I understand correctly, you know the position of the upper-left corner of the bitmap relative to the drawing area. Given the mouse position relative to the drawing area, the position of the mouse coordinates relative to the bitmap are:

mx = mouseX - bitmap_upr_left.x

my = mouseY - bitmap_upr_left.y

You don't mention what OS you're using, but make sure you have both bitmap position and mouse position relative to the same area. You mentioned screen mouse coordinates - be sure to convert that position to the drawing area. In Windows, for instance, if the drawing area is the client area of the window, use ScreenToClient( hwnd, &mousePt) before you do the calcs.

FYI: "panning" is more commonly understood to be a change in position of the viewpoint, not the position of what's being viewed.

Please don't PM me with questions. Post them in the forums for everyone's benefit, and I can embarrass myself publicly.

You don't forget how to play when you grow old; you grow old when you forget how to play.

I know that you can get the pixel's position with the following algorithm:


y * bitmapWidth + x = pixel position (x, y)

When you pan the bitmap around, I thought you can get the pixel's position by adding the delta differences X, and Y to the original pixel's X and Y position. I later found out this isn't correct. What if I panned the bitmap to the negative X and negative Y axes?

So, I'm kind of stuck here. Anyone knows how to solve this?

y * bitmapWidth + x, breaks down if you pass in negative values, you would need to keep x and y separate, and cap either one if they hit less than 0. Or do something else when you hit negative values, like wrap or return a set color, clamp to the border color, etc.

Okay, I'll report back my findings after tweaking my algorithm. This post will be edited at a later time.

This topic is closed to new replies.

Advertisement