Есть ли способ конвертировать пиксельные координаты в декартовые координаты в VB.net - PullRequest
0 голосов
/ 08 января 2019

У меня есть PictureBox размером 1096 x 1004 с SizeMode, установленным в StretchImage. Я могу правильно получить координаты каждого пикселя (см. Код ниже), используя эффект StrechImage для координат пикселей.

Теперь я пытаюсь выполнить преобразование этих пиксельных координат в декартову координату, чтобы иметь возможность строить графики. В конечном итоге я собираюсь взять декартовы координаты и преобразовать их в полярные координаты.

Я пытался преобразовать координаты пикселей в декартову с помощью этого метода.

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

Этот метод не помещает начало координат в (0,0) в центр PictureBox. Кажется, он устанавливает источник ближе к верхнему левому углу PictureBox. Есть ли какие-либо идеи относительно того, что мне не хватает?

Ниже приведен мой код для преобразования изображения в BitMap, получения этих координат и их правильного масштабирования.

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

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Мне кажется, я понял свой вопрос. Я использовал неправильное значение для моего screenx и screeny. Я использовал рассчитанное значение масштаба, но мне нужно было просто использовать значения X и Y события мыши.

0 голосов
/ 08 января 2019

Я не знаю, содержит ли содержимое переменной правильное значение, но формула должна выглядеть примерно так:

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

Переведите в 0,0, добавьте масштабный коэффициент, затем переверните y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...