2012-01-12 2 views
2

나는 점의 두 배열을 갖는다. 예 :매트릭스/좌표 변환 순서

matrix.Rotate(5f); 
matrix.Scale(.8f, 1.1f); 
matrix.Translate(30f, 18f); 
matrix.TransformPoints(transformed); 
  • 원래 포인트 알려진이다.
  • 변형 값 ARE이 알려져 있습니다.
  • 변형이 적용된 순서는 NOT입니다.

어떻게 변환 순서를 계산할 수 있습니까?

편집

  • 변환의 한 라운드있다.
  • 라운드에는 다음과 같이 최대 3 개의 변환이 포함될 수 있습니다.
  • 적용되는 유일한 변형은 회전, 축척 및 평행 이동의 모든 조합입니다.

실제 상황을 알려면 관심이있는 알려진 지점이있는 이미지를 고려하십시오. 이미지를 인쇄하고 스캔 한 다음 다시 읽으려고합니다. 이미지에는 스캔 과정에서 적용된 변형을 계산할 수있는 방향 표시가 있습니다.

지금, 무력 접근 방식은 다음과 같습니다

  1. 읽기 스캔 한 이미지.
  2. 스캔 한 이미지에서 회전을 계산합니다.
  3. 스캔 한 이미지에 회전을 적용하십시오.
  4. 회전 된 이미지의 눈금을 계산합니다.
  5. 회전 된 이미지에 눈금을 적용하십시오.
  6. 크기 조정 된 이미지의 번역을 계산합니다.
  7. 크기 조정 된 이미지에 번역을 적용하십시오.

원본 포인트를 사용하여 처리 된 이미지에서 관심 지점을 읽을 수 있습니다. 물론이 방법은 비용이 많이 든다. 500MB 이미지는 한 번에 메모리에 적어도 2 개의 사본이 있어야하며 그래픽 객체를 사용하여 변환해야합니다.

이 질문의 전제는 이미지를 한 번만 읽고 모든 변환을 계산하여 이미지 자체가 아닌 좌표에 적용하는 것이 었습니다. 변환 된 좌표를 사용하여 관심 지점을 읽습니다. 여기서 '변환 순서'의 문제가 발생합니다. 아래의 유용한 답변 중 일부는 문맥을 깨끗이하기를 바랍니다.

+1

몇 개의 변환이 있습니까? 그것은 나에게 그것이 많은 짐승이 아닌 한 무자비한 접근법이 가장 쉽고 좋을 것이라고 생각합니다. 만약 당신이 많은 것을 가지고 있다면, 당신은 여전히 ​​복잡한 일들을 분석하지 않고 무차별 적 접근이 필요할 것입니다.또한 고유 솔루션을 찾을 수 있다고 보장 할 수 없습니다 (예 : 두 개의 번역이 연속적으로 바뀔 수 있음). – Chris

+0

나는이 문제를 해결할 수 있다고 생각하지 않는다. 예를 들어 번역 기능은 모든 단계에서 수행 될 수 있습니다. 최종 결과는 동일합니다. – musefan

+1

@ 뮤즈 팬 : 실제로 번역에 해당하지 않습니다. 첫 번째 점이'0,1 '이고 두 변환이'0, -1'에 의한 변환이고 원점에 대한 180도 회전이라는 것을 상상해보십시오. 분명히 회전 전에 번역을하는지 여부가 중요합니다. 같은 논의가 스케일링에도 적용됩니다. – Chris

답변

1

당신이 바라보고있는 변형의 수에 대해서는 아마도 수학적 분석을 시도하는 것보다는 가장 쉬운 방법 일 것입니다 (100 % 확신 할 수는 없지만 매우 어려울 것입니다) .

3 가지 변형 (A, B, C)의 경우 6 가지 방법으로 적용 할 수 있습니다. 그들은 :

  • ABC
  • ACB
  • BAC는
  • BCA
  • CAB
  • CBA 그 각각에 대해 그래서

이 입력 순서에 적용하고 최종 제품이 사용자의 출력과 일치하는지 확인하십시오.

특정 변형 중 하나가없는 경우 두 가지 주문 옵션 만 남습니다. 위의 여섯 가지 옵션을 사용하고 누락 된 변환이있는 경우 단위 행렬 (또는 연산 없음)을 적용하는 것이 가장 좋을 수 있습니다. 물론 동일한 변환 순서를 복제하지 못하도록 검사가 필요합니다.

최적의 성능을 얻으려면 어레이의 모든 점을 반드시 확인할 필요는 없습니다. 첫 번째 점이 일치하지 않으면 더 이상 확인할 필요가 없습니다. 물론 배열의 모든 점을 검사하여 일치하는 항목이 있는지 확인하여 우연히 첫 번째 점이 제대로 작동하는지 확인할 수 있습니다. 또한 사소한 변환 (예 : 1의 배율)을 확인하고 어떤 위치에도 나타날 수 있으므로 존재하지 않는 것으로 간주하므로 시작할 때 (또는 최종 또는 중간 - 개인 우선권).

마지막으로 여전히 모호함이있을 수 있습니다. 매우 가능성이 적고 입력 점이 적을지라도 매우 어려울 것입니다. 그것은 당신이 알아야 할 요점입니다. 또한 모호성이 훨씬 더 많은 특수한 경우에 대한 논의는 아래를 참조하십시오.

올바른 방향으로 갈 수 있기를 바랍니다. 나는 당신의 변환 데이터가 어떻게 저장되는지 전혀 모르기 때문에 전체 코드를 작성할 수 없다.

특정 번역이 교환 적인지 여부에 대한 간략한 토론 후 (예 : A와 B를하고 B와 A를 동일하게하는 것) 나는 그들이 그렇지 않다는 것을 믿습니다. X와 Y의 비율 조정이 동일한 특별한 경우에는 스케일링과 회전은 교환 가능하지만 여기에서 사용 된 구문은 스케일링에 X와 Y 스케일 인자로 추정되는 두 가지 요인이 있음을 나타냅니다. 이 경우 스케일링과 회전은 교환 가능하지 않다는 것을 의미합니다. 번역은 절대로 교환 할 수 없습니다 (번역이 원점으로 이동하고 중요한 점을 알 수있는 간단한 경우를 상상해보십시오).

X 축과 Y 축에서 축척이 같을 경우 교환성에 대한 녹턴의 설명이 적용됩니다. 즉, 규모가 같고 회전이 있으면 유효한 두 가지 변환 순서를 얻게됩니다. 이 둘을 구분할 방법이 없습니다.

+2

@Nocturn : OP에 의한 샘플 코드에는 두 개의 매개 변수가 scale 메서드에 전달되므로 X 및 Y에서 다르게 스케일 할 수 있다고 가정합니다.이 경우 스케일링 및 회전은 교환 가능하지 않습니다. 또한 질문의 요점이 어디에 있는지 찾아내는 것이 어떨지 번역이 현명하지 못한 경우에 대한 가정을합니다. 그들이 어디에서나 실제로 점검 할 수 있다고 가정하는 것이 더 좋습니다. – Chris

+0

편집이나 뭐라도 할 수 있다고 생각합니다. 나는 우리가 논의한 이래로 교환 원에 관한 덩어리를 편집 할 것이다. :) – Chris

+0

@Nocturn : 당신도 스케일 인자가 동등한 경우에 모호성이 있음을 실제로 깨닫게했습니다. 실제로 그것을 지적 해 주셔서 감사합니다. :) – Chris

0

CG에서는 매트릭스를 보유하는 것이 꽤 일반적입니다. Stack 즉행렬 (변형, 회전 또는 크기 조절)에서 작업을 수행 할 때마다 새 행렬을 스택에 배치합니다. 이렇게하면 원래 상태로 되돌릴 수 있습니다.

+0

당신이 따라갈 때 그들을 기록하는 것은 물론 순서를 알기위한 좋은 방법이지만,이 질문은 평범한 것이기 때문에이 경우에는 옵션이 아니라고 가정합니다. 물론 그가 왜 그가하는 정보를 가지고 있고 순서가 다른지는 알지 못합니다. :) – Chris

+0

그건 분명히 다른 문제입니다 :). 참조를 위해 [여기] (http://stackoverflow.com/questions/8815223/matrix-coordinate-transformation-in-c-sharp)를 볼 수 있습니다. 나는 질문을 섞어 복잡하게 만들고 싶지 않았다. 나는 그들이 적용된 순서에 대해 아무런 통제력이 없다. –