효율적으로 도형 회전을 계산하는 방법은 무엇입니까?


13

그림 1 그림 2

바이트 행렬 (비트 맵과 같은 행렬)을 통해 표시된 Figure 가 있습니다 . 예제 그림 은에 나와 있습니다 Picture 1.

목표는 주어진 그림 중 가장 좋은 회전 각도를 찾는 것입니다 . Figure가 최상의 각도로 회전하면 X 및 Y 축에 평행하고 Figure 를 나타내는 사각형이 가장 작은 영역을 갖습니다.

그림을 나타내는 사각형은 그림에서 밝은 회색으로 표시됩니다. 에서 Picture 2, 당신은 그림의 이상적인 회전이 30도 시계 방향에 관한 것입니다 볼 수 있습니다.

이제이 각도를 찾는 방법을 알고 있지만 매우 비효율적입니다. 다음과 같이 진행됩니다.

  1. 0에서 45 사이의 각도를 반복하십시오.
  2. 현재 각도의 경우 모든 도형에 대해 새로운 회전 위치를 계산합니다.
  3. 그림 (최소 및 최대 x, y)을 포함하는 사각형의 경계를 찾아서 지금까지 가장 일치하는 경우 등록하십시오
  4. 다음 각도

이것은 일종의 무차별 방식이며 작은 숫자에 적합하고 합리적으로 빠르게 작동합니다. 그러나 최대 1 천만 점을 포함하는 그림으로 작업해야하며 알고리즘이 느려집니다.

이 문제에 대한 좋은 알고리즘은 무엇입니까?

답변:


20

선형 시간 회전 캘리퍼스 알고리즘을 사용하여 임의로 정렬 된 최소 경계 상자 를 찾을 수 있습니다 .

경계 상자가 있으면 측면 중 하나의 기울기를 계산하여 회전 각도를 결정하면됩니다.


이것은 훌륭한 해결책입니다. 아주 좋은 해결책입니다.
정보 :

x, y를 기준으로 점을 정렬 했으므로이 en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/… 를 사용 하여 볼록 껍질을 찾고 선체 지점에 기존 알고리즘을 사용할 수 있습니다.
Dusan

12

접근의 첫 번째 단계에는 결함이 있습니다. 0에서 45 사이 의 무한한 실제 값이 있으므로 "루프를 통과"하는 것은 의미가 없습니다. 그러나 알고리즘을 복구 할 수 있습니다.

  • 다각형 의 볼록 껍질 을 찾으십시오

  • 볼록 껍질의 외부 모서리에 의해 주어진 유한 한 수의 각도를 통해 루프

  • 이제이 각도를 사용하여 2 ~ 4 단계를 적용하십시오.

최소 둘러싸는 사각형이 볼록 껍질의 바깥 쪽 가장자리 중 하나에 닿아 야한다는 것을 알 수 있기 때문입니다.


그렇습니다. 정확히 내가하려는 것입니다. 이미 Dan의 대답에 대한 재치있는 도움을 찾았습니다. 감사합니다.
Dusan

@ Dusan : 다른 답변이 동일한 접근 방식을 설명하는지 잘 모르겠으므로 솔루션을 더 간단한 방법으로 설명하려고 노력했습니다. 여기에서 설명을 찾았습니다 : cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown

그렇습니다. 맞습니다. 당신의 접근 방식은 훨씬 더 구체적이고 간단하고 명확합니다. 그러나 Dan의 대답에 주어진 힌트로 동일한 접근 방식을 스스로 결론 지었으므로 동의했습니다. 답이 훨씬 더 많은 투표를 얻을 수 있기를 바랍니다. 유감 없음. 건배!
두산
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.