-
[퍼즐:05] 모서리 테스트개발 2023. 8. 11. 21:55
쉽게 말해 각 퍼즐의 두 모서리가 이어지는지 검사하는 것.
모서리 정규화 과정에서 Line, Hole, Head로 구분했다.
한 퍼즐의 Hole을 잡고 나머지 퍼즐의 Head와 비교하며 가장 가까운 edge를 찾는 과정이다.
정규화 한 edge를 그냥 비교하면 안되고,
한 쪽을 뒤접어서 비교해야 한다.
public Edge Reverse() { Point first = Points.OrderBy(p => p.X).First(); Point last = Points.OrderBy(p => p.X).Last(); // last -> first의 각을 계산한다. pi에 가까운 숫자가 나온다. var angle = CalculateAngleBetweenPoints(last, first); var reversed = Points // last를 기준으로 평행이동한다. .Select(p => new PointF(p.X - last.X, p.Y - last.Y)) .Select(p => RotatePointAroundOrigin(p, -angle)) .Select(p => new Point((int)p.X, (int)p.Y)) .ToList(); return new Edge(reversed); }
테스트 하는 방법은 직곽적인 방법이기도 하고,
이미 앞선 분이 선택한 방법이기도 하다.
모든 점을 순회하면서 상대방 edge에서 가장 가까운 점의 거리를 다 더하는 것이다.
public double Test(Edge other) { var reversed = other.Reverse(); double distanceSum = Points .Sum(thisPoint => reversed.Points.Min(otherPoint => Distance(thisPoint, otherPoint))); return distanceSum; }
내가 테스트 하고 있는 퍼즐은 총 세 조각인데,
이중 둘이 연결된다.
한 개의 Hole과 4개의 Head를 비교해봤다.
비교했을 때 첫번째 쌍이 거의 비슷하다.
눈으로 보면 찾을 수 있을 것 같다.
Test 함수의 결과도 마찬가지였지만 생각보다 값이 컸다.
440을 더 작은 수로 줄일 수 있으면 좋겠다는 생각을 했다.
앞으로 어떨지 모르겠지만 정밀도에 대해 고민이 필요할 수도 있겠다.
통계 기법을 잘 활용해야 할 듯
추가 코드 없음
'개발' 카테고리의 다른 글
[퍼즐:07] 500조각 퍼즐 맞추기 (촬영) (2000조각 연습) (0) 2023.12.25 [퍼즐:06] 1차 중간 점검 (0) 2023.08.13 [퍼즐:04] 퍼즐 모서리 정규화 (0) 2023.08.08 [퍼즐:03] 퍼즐 조각 외곽선을 각 모서리로 분할 (0) 2023.08.07 [퍼즐:02] 퍼즐 조각 외곽선에서 코너 검출 (0) 2023.08.06