2013-08-13 1 views
1

6x6 그리드에서 3 가지 항목의 위치를 ​​관리하는 클래스를 디자인하는 가장 효율적인 방법에 대한 지침을 찾고 있습니다. 그리드의 항목은 이동하거나 위치를 변경할 수 없지만 전체 그리드는 시계 방향/반 시계 방향으로 90 도씩 회전 할 수 있으며 iOS에서 실시간으로 그리드의 사용자 터치/드래그 조작에 따라 가로/세로로 뒤집을 수 있습니다 장치. 전체 그리드를 회전 및/또는 뒤집기의 결과로 그리드의 3 개 항목은 회전되지 않은 "위치 참조"그리드를 기반으로 서로 다른 "절대"위치에있게됩니다. 그리드의 각 "변형"후에 가장 효율적인 방식으로 결정하려고하는 것은 이러한 새로운 항목 위치입니다.iOS에서 회전/뒤집기 후 그리드의 항목 위치를 효율적으로 관리하는 방법

: 내가 달성하기 위해 노력하고 무엇을 설명하기 위해

, 나는 왼쪽 상단 모서리가 아래 다음 오른쪽에 위치 0와 숫자 증가되는 그리드의 위치를 ​​번호입니다 ... 기능은 다음 을 고려 위치 참조 그리드 :

------------------------- 
| 0 | 1 | 2 | 3 | 4 | 5 | 
------------------------- 
| 6 | 7 | 8 | 9 | 10| 11| 
------------------------- 
| 12| 13| 14| 15| 16| 17| 
------------------------- 
| 18| 19| 20| 21| 22| 23| 
------------------------- 
| 24| 25| 26| 27| 28| 29| 
------------------------- 
| 30| 31| 32| 33| 34| 35| 
------------------------- 

나는 항상/어떤 회전에 관계없이이 번호를 사용하여 그리드에서 항목의 위치를 ​​참조 그리드에 적용되는 변환 플립 계획입니다. 따라서, 예를 들어, 나는 위치에 A = 7 항목, B = 9, C = 14

원본이있는 경우 :

------------------------- 
| 0 | 1 | 2 | 3 | 4 | 5 | 
------------------------- 
| 6 | A | 8 | B | 10| 11| 
------------------------- 
| 12| 13| C | 15| 16| 17| 
------------------------- 
| 18| 19| 20| 21| 22| 23| 
------------------------- 
| 24| 25| 26| 27| 28| 29| 
------------------------- 
| 30| 31| 32| 33| 34| 35| 
------------------------- 

를 90도 시계 방향으로 격자를 회전, 새 항목의 위치가 될 것입니다 = 10, B = 22, C = 15이다.

회전 시계 방향으로 90도 :

------------------------- 
| 0 | 1 | 2 | 3 | 4 | 5 | 
------------------------- 
| 6 | 7 | 8 | 9 | A | 11| 
------------------------- 
| 12| 13| 14| C | 16| 17| 
------------------------- 
| 18| 19| 20| 21| B | 23| 
------------------------- 
| 24| 25| 26| 27| 28| 29| 
------------------------- 
| 30| 31| 32| 33| 34| 35| 
------------------------- 

(90, 180, 각면에 270도 0), 각각의 아이템은 정확히 8 개 알려진 위치에있는에 기초하여 상기 그리드 단지 8 개의 가능한 방향이있다 그리드의 방향. 따라서 8 방향 배열 각각에 대해 3 가지 항목의 절대 위치를 포함하는 8 개 3 항목 배열을 하드 코딩 할 수 있습니다. 배열 당 하나의 배열입니다. 일단 어떤 변형 후에 그리드가 어떤 방향인지 알게되면 그리드 방향에 해당하는 항목 위치의 올바른 3 항목 항목 배열을 가져 와서 3 항목의 새로운 위치를 얻습니다.

그리드 변환이 iOS에서의 터치 조작에 직접적으로 반응하고 그리드에 더 많은 항목이있을 수 있기 때문에 한 번에 여러 그리드에 대해이 위치 검색을 수행해야하므로, 코딩은 이동하거나 그리드의 회전 또는 뒤집기가 발생하면 그리드에서 항목의 위치를 ​​계산하거나 동적으로 결정하는 좀 더 정교한 방법이있는 경우에 사용할 수있는 방법입니다.

모든 조언, 의견, 제안은 대단히 감사하겠습니다.

미리 감사드립니다.

답변

0

그리드 위치를 다시 번호 매기기에서 시작하십시오. 셀 번호가있는 직선 번호 매기기 체계 대신 (row, column) 쌍의 두 숫자 체계를 사용하십시오. 간단한 수학을 통해 두 가지 계획 사이를 쉽게왔다 갔다 할 수 있습니다. 보드 중심을 (0,0)으로하십시오. 그러면 포인트는 A=(3,-3), B=(3,1)C=(1,-1)에 위치합니다.- 0 ° - 1 90

  • 원래 (row, column)
  • 회전 (0 대신에이 번호 매기기로

    항목의 위치는 세 가지에 의해 결정될 수 있음을 관찰 2 - 180 - 3 270도) 가로축
  • 플립 (0 - 없음 플립 - 1 플립) 세로축

뒤집기는 호리 따라 젖혀 나타낸다 zontal 축 다음 180 ° 회전.

좌표를 쉽게 뒤집을 수 있습니다. 행을 그대로 유지하면서 column의 부호를 변경하십시오. 포인트의 뒤집기 위치는 A=(3,3), B=(3,-1)C=(1,1)입니다.

회전을 제조하는 일반적인 방법은 rotation matrix 의해 left-multiplying 좌표 열 벡터가있다 : 여기

Left-multiply:

는 행렬들의리스트가 90 ° 회전을 수행하고, 180 및 270 ° : 제안에 대한

Rotate 90°Rotate 180°Rotate 270°

+0

감사합니다. 나는 행렬 수학에 익숙하지만 비교적 적은 수의 항목과 격자를 다루는 데 다소 과잉이라고 생각했습니다. 그럼에도 불구하고 내 구체적인 데이터와 관련된 귀하의 제안에 대해 몇 가지 질문이 있습니다. 더 많은 것을 위해 다음 주석을보십시오 ... – JavaJoe

+0

당신은 보드의 중심을 (0,0)으로 설정하는 것을 말합니다. 그러나 그리드는 짝수 개의 행과 열을 가지므로 절대 셀 위치가 당신을 중심으로 사용하도록 제안하고 있습니다 포인트? 귀하의 설정'A = (2, -2)'및'(C = 1, -1)'에 기초하여, 원래 게시물의 셀 21을 포인트 (0,0)로 사용하는 것이 좋습니다. 그렇다면'B = (2,0)'이 아니라'B = (2, -1)'이됩니다. 또한, H 플립 이후, 포인트는 'A = (2,1)','B = (2, -1)','C = (1,1)'이므로 수학은 아웃. 이것이 마치 그래프 인 것처럼 그리드의 실제 중심 (셀이 아닌)을 점 (0,0)으로 표시해야하는 것처럼 보일 것입니다. – JavaJoe

+0

@JavaJoe 짝수 개의 행과 열이있는 격자의 경우 셀 14, 15, 20 및 21을 경계로하는 선의 교차점을 원점으로 사용하는 것이 좋습니다. 점 '0,0'은 그리드의 셀이 아니며 선의 교차점입니다. 각 셀은 2 단위 넓이이며 점은 홀수 좌표에 있고 짝수 좌표에있는 선 (내 대답에는 3 대신 2를 사용했습니다 - 틀렸고 현재 고정되어 있습니다). 그리드에 홀수의 행과 열이있는 경우 원점을 중앙 셀로 이동하고 1 단위 폭의 셀을 사용합니다. – dasblinkenlight

관련 문제