2011-09-19 3 views
4

4 포인트가 직사각형을 이루고 있으며, 사용자가 임의의 포인트를 이동하고 사각형을 각도 (센터 포인트를 중심으로 각 포인트를 회전 시킴)로 회전하도록 허용하고 있습니다. . 거의 완벽한 Rectangle 모양으로 유지됩니다 (PointF 정밀도가 허용하는 한). 다음은 네 가지 점에서 그려 내 "사각형"의 예 :다각형의 4 포인트에서 너비와 높이를 계산합니다.

enter image description here

을 그러나, 나는이 점 사이의 폭과 높이를 얻을 수 있어야합니다. 사각형이 회전하지 않을 때이 간단하지만 내가 그것을 회전하면 내 수학은 여기에 빨간색 테두리로 표시 폭과 높이 반환

enter image description here

내가 (위에서 시계 방향으로 점의 순서를 알고 가정을 -left 예를 들어), 그들이 나타내는 사각형의 너비와 높이를 검색하려면 어떻게해야합니까?

+0

이것은 실제로 더 많은 기하학 문제입니다. 처음 세 점을 취해 가장자리의 길이를 계산할 수 있습니다. 정밀도를 약간 높이려면 다른 두 모서리 길이로 길이를 평균 할 수 있습니다. 수식은 http://en.wikipedia.org/wiki/Pythagorean_theorem –

+4

을 참조하십시오. 회전 된 사각형의 "너비"를 정확히 정의 할 수 있습니까? –

+0

회전되지 않은 사각형과 같습니다. 마찬가지로 너비가 100 인 직사각형을 4 포인트 씩 가져 와서 회전하면 너비가 변경되지 않아야합니다. 직사각형의 회전에 상관없이 100의 값을 계산할 수 있어야합니다. –

답변

6

, 당신은 할 수 있습니다 :

double width = Math.Sqrt(Math.Pow(point[1].X - point[0].X, 2) + Math.Pow(point[1].Y - point[0].Y, 2)); 
double height = Math.Sqrt(Math.Pow(point[2].X - point[1].X, 2) + Math.Pow(point[2].Y - point[1].Y, 2)); 
+0

감사합니다. –

+0

-1 가르침이없는 대답. – Shibumi

5

두 점 사이의 거리에 대한 알고리즘을 사용하기 만하면됩니다. 포인트 A, B, C, D가있는 경우 두 거리를 얻습니다.

sqrt((Bx-Ax)^2 + (By-Ay)^2)

은 폭과 하나 신장 될 수 하나를 선택 sqrt((Ax-Dx)^2 + (Ay-Dy)^2)

에 동일 해집니다 sqrt((Dx-Cx)^2 + (Dy-Cy)^2)

sqrt((Cx-Bx)^2 + (Cy-By)^2)에 동일 해집니다. "폭"과 "높이"로, 당신은 단지 가장자리의 길이를 의미합니다, 당신은 목록 또는 배열에 4 명 PointF 구조가있는 경우

1

이의 말합시다 맨 위 코너 A. 그런 다음, 두 지점 사이의 거리를 말한다 찾을 ABCD 같은 다른 에지를 B와 C 사이

직사각형 폭 = 거리 내지 B 직사각형
높이 = 거리

수식 반 시계 이름 A (x1, y1) 및 B (x2, y2)는 다음과 같다 :

d = sqrt((x2 - x1)^2 + (y2 - y1)^2) 

여기서 d는 거리이다.

관련 문제