2014-10-14 2 views
0

그래서 이미지가있는 그림 상자가 있습니다. 여러 개의 직사각형과 같은 특정 상자를 장치에서 가져 오는 좌표가 있습니다. 당신이 pbZoneImage의 그림 상자에 대한 상대 포인트 값으로 변경이 나를 볼 수 있도록그림 상자에 직사각형 그리기 좌표 뒤집기?

Dim rectPoint_Start As Point = 
    New Point((newStartPoint_X * pbZoneImage.Width/resWidth), 
       newStartPoint_Y * pbZoneImage.Height/resHeight) 
Dim rectPoint_End As Point = 
    New Point((newEndPoint_X * pbZoneImage.Width/resWidth), 
       newEndPoint_Y * pbZoneImage.Height/resHeight) 
Dim rectangleHeight As Integer = (rectPoint_End.Y - rectPoint_Start.Y) 
Dim rectangleWidth As Integer = (rectPoint_End.X - rectPoint_Start.X) 

'localize 
camRect1 = New Rectangle(rectPoint_Start.X, rectPoint_Start.Y, _ 
rectangleWidth, rectangleHeight) 
If camRect1 <> Nothing Then g.DrawRectangle(Pens.Blue, camRect1) 

RECT 좌표는 해상도로 스케일링에오고있다. 내가 겪고있는 문제는 (장치에서)받는 좌표가 (0,0) 점이 왼쪽 하단에 있다고 가정 할 때 PB가 왼쪽 상단부터 시작하여이 상자를 그립니다. g.drawRectangle()에서 그려지는 시작점의 방향을 변경하는 방법이 있습니까? 또는 다른 방법.

내가 지금까지 시도한 것은 rectPoint_EndrectPoint_Start 점에 (pbzoneImage.bottom) - ((newEndPoint_X * pbZoneImage.Width ....)을 추가하는 것입니다. 그것은 작동하지 않는 것 같아서 나에게 부정적인 가치를 준다.

업데이트 :

그래서 이것이 내가 그것을 해결하기 위해 일을 결국 것입니다. 나는 내가받은 응답의 일부를 바탕으로 좌표계를 그리기 시작했고 오래된 학교 대수학을했다.

Dim rectangleHeight As Integer = Math.Floor((newEndPoint_Y - newStartPoint_Y) * pbZoneImage.Height) 
    Dim rectangleWidth As Integer = Math.Floor((newEndPoint_X - newStartPoint_X) * pbZoneImage.Height) 

    'flip rectangle 

    Dim rectPoint_Start As New Point((newStartPoint_X * pbZoneImage.Width), _ 
      pbZoneImage.Height - (newStartPoint_Y * pbZoneImage.Height) - rectangleHeight) 

    Dim rectPoint_End As Point = New Point((newEndPoint_X * pbZoneImage.Width), _ 
      pbZoneImage.Height - (newEndPoint_Y * pbZoneImage.Height) - rectangleHeight) 

     'localize 
     camRect1 = New Rectangle(rectPoint_Start.X, rectPoint_Start.Y, _ 
      rectangleWidth, rectangleHeight) 
+0

너무 많은'they'와'them'은 계속 추적 할 것이므로, 나는 따라 가지 않는다. 그러나 Rectangle에는 Offset 메서드가 있습니다. * 작업하기 전에 Rectangle에 오프셋 메서드가 있습니다. * – Plutonix

+0

아, 다음 질문에서 분명히 설명해 드리겠습니다. – Kat

답변

1

장치에서 newStartPoint_YnewEndPoint_Y 값을 수신하면 (리마인더, pbZoneImage 끝점 X 및 Y와 함께 그림 상자, 시작점의 x 및 y하는 장치의 값이다), 다음을 수행

newStartPoint_Y = resHeight - newStartPoint_Y 
    newEndPoint_Y = resHeight - newEndPoint_Y 

기기가 0 기반의 좌표에 좌표를 제공한다고 가정하면 (왼쪽 하단의 점은 왼쪽 위 모퉁이의 0부터 시작하는 좌표에 해당하는 좌표 (0,0) 임) a PictureBox)
잘 이해한다면 newStartPoint_X/Y와 newEndPoint_X/Y는 장치에서 직접 나온 좌표입니까?

내가 사용하는 습관을 가지고하는 것이 좋습니다 중 하나 CInt() 정수 X와 Y 값, 또는 더 나은와 Point 사용 : 어쨌든 좌표를 확장하고 있기 때문에 PointF와 CSng()을.

+0

Cint()를 사용하는 이유는 무엇입니까? – Kat

+0

불행히도, resheight 빼기 시도하고 너비를 계산할 때 그것은 부정적인 가치를 주었다. – Kat

+2

'CInt (newStartPoint_X * pbZoneImage.Width/resWidth)'는 계산 결과의 부동 소수점 결과를 유효한 정수로 변환합니다. 이러한 좁은 형 변환 (Float-> Integer)을 사용하면 나중에 복잡한 코드로 문제가 발생합니다. 좁은 전환을 강조 표시하려면 Option Strict On을 사용하십시오. 이는 더 안전한 코딩을위한 것입니다. –

0

나는 또한 직사각형 높이를 조정하는 것을 잊고 있다고 생각합니다. 직사각형의 원점이 왼쪽 아래이고 이미지의 왼쪽 아래 원점을 기준으로 크기가 조정 된 이미지 좌표계에 매핑 된 경우 크기가 조정 된 이미지 높이와 매핑 된 사각형 높이를 조정해야합니다. 관계를 바로 잡으려면 종이에 그것을 스케치하십시오.