GoForIt
GoForIt

Reputation: 49

Is there a way to convert Pixel coordinates to Cartesian Coordinates in VB.net

I have a PictureBox that is sized 1096 x 1004 with the SizeMode set to StretchImage. I am able to get the coordinates of each pixel correctly(see code below) by factoring in the StrechImage effect on the pixel coordinates.

Now what I am trying to accomplish is converting those pixel coordinates to a Cartesian Coordinate to be able to graph. In the long run, I am going to take the Cartesian Coordinates and convert them to Polar Coordinates.

I have tried to convert the pixel coordinates to cartesian by using this method.

cartesianx = scalefactor*screenx - screenwidth / 2;
cartesiany = -scalefactor*screeny + screenheight / 2;

This method is not putting the origin at (0,0) in the center of the PictureBox. It seems to be setting the origin closer to the Upper Left of the PictureBox. Is there any idea as to what I am missing?

Below is my code to convert the image to BitMap and get those coordinates and scale them correctly.

Imports System.IO

Public Class HomePanel

Dim realX As Int32
Dim realY As Int32

Private Sub HomePanel_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    chartImageDisplay_box.Image = Image.FromFile("C:\Users\UserB\Desktop\test.jpg")

End Sub


Private Sub chartImageDisplay_box_MouseMove(sender As Object, e As MouseEventArgs) Handles chartImageDisplay_box.MouseMove

    If (e.Button = MouseButtons.Left) Then
        ShowCoords(e.X, e.Y)
    End If

End Sub



Private Sub chartImageDisplay_box_MouseDown(sender As Object, e As MouseEventArgs) Handles chartImageDisplay_box.MouseDown
    If (e.Button = MouseButtons.Left) Then
        ShowCoords(e.X, e.Y)

        Dim MyBitmap As Bitmap
        MyBitmap = CType(chartImageDisplay_box.Image, Bitmap)
        'Me.BackColor = MyBitmap.GetPixel(realX, realY)
        rgbValue.Text = "RGB Value: " & MyBitmap.GetPixel(realX, realY).ToString()

    End If
    'printAllPixels()

End Sub


Private Sub ShowCoords(ByVal mouseX As Int32, ByVal mouseY As Int32)
    Dim realW As Int32 = chartImageDisplay_box.Image.Width
    Dim realH As Int32 = chartImageDisplay_box.Image.Height
    Dim currentW As Int32 = chartImageDisplay_box.ClientRectangle.Width
    Dim currentH As Int32 = chartImageDisplay_box.ClientRectangle.Height
    Dim zoomW As Double = (currentW / CType(realW, Double))
    Dim zoomH As Double = (currentH / CType(realH, Double))
    Dim zoomActual As Double = Math.Min(zoomW, zoomH)
    Dim padX As Double = If(zoomActual = zoomW, 0, (currentW - (zoomActual * realW)) / 2)
    Dim padY As Double = If(zoomActual = zoomH, 0, (currentH - (zoomActual * realH)) / 2)
    realX = CType(((mouseX - padX) / zoomActual), Int32)
    realY = CType(((mouseY - padY) / zoomActual), Int32)
    lblPosXval.Text = "X: " & If(realX < 0 OrElse realX > realW, "-", realX.ToString())
    lblPosYVal.Text = "Y: " & If(realY < 0 OrElse realY > realH, "-", realY.ToString())
    cartX.Text = "X: " 'Where to add the cart conversion for X
    cartY.Text = "Y: " 'Where to add the cart conversion for Y

End Sub


'Writes all the pixels to a text file along with RGB values for each pixel
Public Sub printAllPixels()
    Using writer As StreamWriter =
        New StreamWriter("C:\Users\UserB\Desktop\Pixels.txt")

        Dim MyBitmap As Bitmap
        MyBitmap = CType(chartImageDisplay_box.Image, Bitmap)


        For y = 0 To MyBitmap.Height - 1
            For x = 0 To MyBitmap.Width - 1
                writer.WriteLine("XY Coord: " & x & ", " & y & ";   " & MyBitmap.GetPixel(x, y).ToString)
            Next
        Next


    End Using
End Sub
End Class

Upvotes: 0

Views: 1359

Answers (2)

GoForIt
GoForIt

Reputation: 49

I believe I figured my question out. I was using the wrong value for my screenx and screeny. I was using the calculated scale value but I needed to just use the mouse event X and Y values.

Upvotes: 0

the_lotus
the_lotus

Reputation: 12748

I don't know if the content of the variable contains the right value but the formula should look more like this:

cartesianx = scalefactor * (screenx - (screenwidth / 2))
cartesiany = -scalefactor* (screeny - (screenheight / 2))

Translate to 0,0 add the scale factor then flip the y.

Upvotes: 2

Related Questions