2011-08-23 3 views
2

이전 그래픽 편집기의 회전 및 자르기 사각형 설정을 이전 편집기와 다른 좌표계를 사용하는 새 편집기로 변환하려고합니다. 모두 X에서는, 모든 좌표가 가장자리에 걸쳐 정규화된다 (즉, 0 내지 1 : 그리고좌표를 회전 된 좌표계로 변환

rectangles illustration

모든 사각형 (2 예 3)와 동일한 종횡비 다음 그림은 문제를 도시 Y 방향).

이전 프로그램은 녹색 직사각형 (원점이 A)과 정렬 된 좌표계에서 주어진 파란색 직사각형 C의 모서리 좌표와 노란색 직사각형의 회전 각도를 저장합니다.

새 프로그램은 노란색 직사각형과 정렬 된 좌표계에서 파란색 직사각형의 모서리 좌표를 필요로합니다 (원점은 B). 구식에서 신형으로 변환하는 방법은 무엇입니까?

이것은 간단한 수학 문제처럼 보입니다. 수학 수업이 끝난 후 수년 동안 필자와 펜으로이 사이트를 검색하거나이 사이트를 검색 할 수 없었습니다 (많은 비슷한 질문이 있지만 찾지 못했습니다. 꽤 일치하는 하나 ...)

+0

알려진 변수를 명확하게 설명하지 못했을 것입니다. 직사각형 C의 좌표와 X 축 (모든 좌표계 A에 있음)의 회전 각도 만 알려져 있습니다. B의 좌표는 알 수 없습니다. 그러나 A와 B의 종횡비가 모두 같고 B가 A 내부에 들어갈 수있는 가장 큰 직사각형 인 것으로 알려져 있습니다. C 직사각형은 실제로 A의 내부에있을 수 있으며 다른 종횡비를 가질 수 있습니다. – JPK

+0

B를 더 쉽게 계산할 수있는 추가 제약 조건 : 사각형 B가 사각형 A의 가운데에 배치됩니다. – JPK

답변

2

C의 네 모서리를 b(0)을 B의 좌표계가있는 모서리 B라고합시다. q을 B의 x 축의 회전 각이라고합시다.이 모든 각도와 점은 동일한 좌표계에서 지정해야합니다.

은 (물건이 측정 방법에 따라 또는 -q) 각도 q하여 벡터 c(i) - b(0) 회전, B에서 c(i)의 좌표를 확인하는 방법. 이를 위해 회전 행렬을 사용할 수 있습니다. cq = cos(q), sq = sin(q)(dx, dy) = c(i) - b(0)으로 설정하십시오. B에서 c(i)의 좌표는

Product of the rotation matrix for q and (dx, dy)


이다 C.의 중심 S(s)s 의해 스케일링 행렬이라하자 및 R(q)q 의해 회전 행렬이라하자 c = (c(0) + c(2))/2는하자. B의 코너는 또한 공지 된 구형의

b(i) = c + S(s) * R(q) * (c(i) - c) 

모서리 a(0), a(1), a(2), a(3) 주어진다. 우리는 스케일링 매개 변수의 가능한 최대 값을 결정하고자하는 s 모든 지점 B의 b(i)

내가 여기 가장 안전하고 간단한 방법은 b(i)a(i) 등을위한의 관련 쌍을 고려하는 것입니다 생각 사각형 A. 내에 있도록 쌍은 가장 큰 값인 s(i, j)을 계산하여 s = s(i, j)이면 b(i)a(j)의 모서리 영역 내에 있습니다.

a(0)a(2)가의 반대 모서리하고 c(0)c(1)는 C. 인접한 모서리 r(j) = a(j) - cd(i) = R(q) * (c(i) - c)하자하자하자.

각 대각선 i

r(j)에 의해 정의 된 영역 외부로 이동하기 전에 B

s(i, j) = min (|r(j).x|/|d(i).x|, |r(j).y|/|d(i).y|) 

의해 스케일링 될 수있다. i = 0, 1j = 0, 2에 대해 s(i, j)을 계산하고 s을 해당 값의 최소값으로 설정하십시오.


q는 당신이 화면 비율의 문제를 설명하기 위해 변환을 q' = atan2(kx * sin(q), ky * cos(q))q에 적용해야 할 수 있습니다 측정 방법에 따라.

+0

불행히도 b (0)을 알 수 없으므로이 문제는 해결되지 않습니다 (위의 내용 참조). 여전히 이것이 도움이되었습니다. 지금은 이것이 실제로 두 개의 독립적 인 문제이며, 당신은 후자에 대한 대답이라고 생각합니다. 이제는 A와 B의 종횡비 제약 조건이 주어 졌을 때 b (0)의 좌표를 찾아야합니다. 그런 다음 수식을 사용하여 모든 종류의 C를 변형 할 수 있습니다. – JPK

+0

@JPK 확장 된 토론을 추가했습니다. – antonakos

+0

당신의 대답은 사각형 C가 항상 A와 B와 같은 종횡비를 가질 것이라고 가정하고있는 것처럼 보입니다. 항상 그렇지는 않습니다. 그러나 C를 회전 된 A로 바꾸고 알고리즘을 사용하여 s를 찾으면 b (i)를 계산할 수 있습니다. 그 후에 C의 좌표를 회전 할 수 있습니다. 도움을 주셔서 대단히 감사합니다! – JPK