2017-01-23 6 views
0

У меня есть панель с backgroundimage, имитирующая график XY, как вы можете видеть на изображении ниже.Конвертировать XY ссылку на ссылку на пиксель

Я создаю pictureboxes динамически на основе данных, вводимых пользователем:

  • количество изображений
  • (X, Y) координаты

PanelPng

Проблема заключается в том, что координаты определенных в программном обеспечении нативной машине, с диапазоном X and Y from -100 to +100. Моя панель 200px x 200px.

Я пытался что-то вроде:

If X < 0 and then 
    X0 = X-100 
ElseIf X > 0 then 
    X0 = X+100 
Else 
    X0 = X 
End If 

(...) 
PictureBox(n).location = new point (X0,Y0) 

Но я думаю, что это не хорошо, чтобы сделать что-то вроде этого. Любая идея сделать это лучше?

---- EDIT ----

Лучший подход до сих пор:

Select Case X And Y 
      Case CInt(X < 0 And Y > 0) 
       X0 = X + 100 
       Y0 = Y - 100 
      Case CInt(X < 0 And Y < 0) 
       X0 = X + 100 
       Y0 = Y + 200 
      Case CInt(X > 0 And Y > 0) 
       X0 = X + 100 
       Y0 = Y + 100 
      Case CInt(X > 0 And Y < 0) 
       X0 = X + 100 
       Y0 = Y + 200 
      'Missing when X=0 and so on 
End Select 

---- EDIT ----

Теперь посмотрим на примере.

Все ответы, которые вы даете, не соответствуют вопросу.

| X | Y | | X0 | Y0 | 
|-100|100 | | 0 | 0 | 
| 20 | 40 | |120 | 60 | 
| -60|-20 | | 40 | 120 | 
| 60|-80 | | 160| 180 | 

cartesian vs panel location

+0

бы [Modulo] (https://en.wikipedia.org/wiki/Modulo_operation) помочь? –

+0

@UweKeim Похоже, вы! Я ищу аналогичную функцию, чтобы проверить ее! –

+0

поэтому ваша панель 500px x 500px или 200px x 200px? и вы хотите конвертировать из (от -100 до 100) в (от 0 до 500)? если да, вы можете сделать просто: '(X + 100) * (500/200)' где 200 - это расстояние от -100 до 100 –

ответ

2

X0 = X + 100 Просто и Y0 = 100 - Y должны работать! например:

  • , если X = -100, то Х0 = 0,

  • Когда X = 0, то Х0 100

  • , когда Х = + 100 Х0 200,

Поэтому, когда X находится в пределах от -100 до 100, X0 будет находиться между 0 и 200, как вы хотите!

Отредактировано как:Y0 = 100 - Y Проверено с данными образца и его нормально

  • , если Y = -100, то Y0 200,

  • Когда Y = 0, то Y0 является 100,

  • при Y = + 100 Y0 равно 0.

+0

Как я сказал:« Что, если вход X = -100 и Y = 50? Он не работает должным образом. Y = 50 в графе отличается от Y = 150 в панели. ' –

+0

Это зависит от квадранта ... –

+0

Я обновил ответ как' Y0 = 100 - Y', пожалуйста, просмотрите и принять его, если его ok –

0

Похоже, вы пытаетесь преобразовать декартовы координаты в координаты экрана.

Dim xmin As Integer = -100 
    Dim xmax As Integer = 100 
    Dim xrng As Integer = xmax - xmin 

    Dim ymin As Integer = -100 
    Dim ymax As Integer = 100 
    Dim yrng As Integer = ymax - ymin 

    Dim center As New Point(xrng \ 2, yrng \ 2) 'center on screen 

Как только у нас есть центр, другие декартовы координаты могут быть преобразованы в координаты экрана.

Dim newcpt As New Point(-50, 50) 'new cartesian pt 
    Dim drawpt As New Point(center.X + newcpt.X, center.Y + newcpt.Y) 'new cartesian pt translated to screen location 
+0

Мне нужен подход из-за квадранта, который он подходит. Он не работает каждый раз так. См. Редактирование! –

+0

@ i.Dio - для каких декартовых точек это не работает? – dbasnett

0

Что вы ищете, это перевернуть Y, а затем перевести начало координат. От панели до декартовой.

x0 = x - 100 
y0 = -(y - 100) 

Сделайте обратное наоборот.

x0 = x + 100 
y0 = -y + 100 

enter image description here

+0

Как я могу управлять этим с помощью моего примера? –

+0

@ i.Dio вы попробовали вторую формулу в своем ответе? Он даст тот же результат от ввода, который у вас есть. –

+0

есть. он отлично работает, используя только «часть изображения» (последняя). Но это фоновое изображение в панели, я не могу показать только его часть. –

Смежные вопросы