2026-06-05 13:44:39 +09:00

88 lines
3.5 KiB
C#

using Aurora.Api;
using System;
using System.Collections.Generic;
namespace VisionCommon {
/// <summary>
/// 패턴 유틸 클래스
/// </summary>
public static class PatternUtil {
private static Logger _logger = new Logger(typeof(PatternUtil).Name);
/// <summary>
/// UI 콤보 박스용 패턴 설명 생성
/// </summary>
/// <param name="patternInfo">패턴 정보</param>
/// <returns>패턴 설명</returns>
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}";
}
/// <summary>
/// 패턴 검출 결과의 레퍼런스 인덱스를 구한다.
/// </summary>
/// <typeparam name="T">포인트 타입, 예)ImagePoint, StaticPoint</typeparam>
/// <param name="measurePoints">패턴 검출 결과</param>
/// <param name="referencePoints">레퍼런스</param>
/// <param name="distanceTolerance">허용 거리(Spec)</param>
/// <returns>패턴의 레퍼런스 인덱스 (성공 : 0 ~ , 실패 : -1)</returns>
public static List<int> GetNearestPointIndex<T>(
List<T> measurePoints,
List<T> referencePoints,
double distanceTolerance) where T : DoublePoint {
var results = new List<int>();
// 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;
}
}
}