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;
}
}
}