using Aurora.Api; using System; using System.Collections.Generic; namespace VisionCommon { /// /// 패턴 유틸 클래스 /// public static class PatternUtil { private static Logger _logger = new Logger(typeof(PatternUtil).Name); /// /// UI 콤보 박스용 패턴 설명 생성 /// /// 패턴 정보 /// 패턴 설명 public static string GetPatternDescription(PatternInfo patternInfo) { var patternSymbol = ""; if (patternInfo is FovPatternInfo) { patternSymbol = "[FP]"; // Fov Pattern } else { patternSymbol = "[CP]"; // Cam Pattern } return $"{patternSymbol}_{patternInfo.GetPatternId()}_{patternInfo.PatternType}_{patternInfo.Description}"; } /// /// 패턴 검출 결과의 레퍼런스 인덱스를 구한다. /// /// 포인트 타입, 예)ImagePoint, StaticPoint /// 패턴 검출 결과 /// 레퍼런스 /// 허용 거리(Spec) /// 패턴의 레퍼런스 인덱스 (성공 : 0 ~ , 실패 : -1) public static List GetNearestPointIndex( List measurePoints, List referencePoints, double distanceTolerance) where T : DoublePoint { var results = new List(); // 1. 파라미터 체크 if (measurePoints == null || measurePoints.Count == 0) { _logger.FuncE("measurePoints : null or empty"); return results; } if (referencePoints == null || referencePoints.Count == 0) { _logger.FuncE("referencePoints : null or empty"); return results; } // 2. 모든 조합의 measure-reference point의 거리를 구한다. double[,] distanceMap = new double[measurePoints.Count, referencePoints.Count]; // Row (j) : measure point for (int j = 0; j < measurePoints.Count; j++) { // Col (i) : reference point for (int i = 0; i < referencePoints.Count; i++) { distanceMap[j, i] = MathUtil.CalculateDistance( measurePoints[j], referencePoints[i]); } } // 3. distanceTolerance를 초과하지 않는 최소 거리의 reference인덱스를 구한다. // Row (j) : measure point for (int j = 0; j < measurePoints.Count; j++) { int nearestIndex = -1; double nearestDist = Double.MaxValue; // Col (i) : reference point for (int i = 0; i < referencePoints.Count; i++) { double curDistance = distanceMap[j, i]; if (curDistance <= distanceTolerance && // distanceTolerance 체크 curDistance < nearestDist) { // 최소 거리 체크 nearestDist = curDistance; nearestIndex = i; } } results.Add(nearestIndex); } return results; } } }