/*
* Copyright (c) 2025 LG Electronics Inc.
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
*/
using Aurora.Api;
using VisionCommon;
using System.Collections.Generic;
namespace VisionAligner {
public class AlignerImpl {
private static Logger _Logger = new Logger("AlignerImpl");
#region N-Point Align
///
/// Source(이동)를 Target(고정)에 맞추는 얼라인 XYT
///
/// Head 얼라인 : Source(RefPoint), Target(MeaPoint)
///
///
/// Stage 얼라인 : Source(MeaPoint), Target(RefPoint)
///
///
/// 이동 포인트
/// 고정 포인트
/// Y축 반전
/// 보정량 XYT
public static AlignDelta CalculateT(
List srcPoints,
List tgtPoints,
int flipY) {
var alignDeltaT = NativeAligner.AlignT(srcPoints, tgtPoints);
alignDeltaT.T = CoordSystem.DenormalizeAngleDirection(alignDeltaT.T, flipY);
return alignDeltaT;
}
///
/// ICP 알고리즘을 이용하여 Source(이동)를 Target(고정)에 맞추는 얼라인 XYT
///
/// Head 얼라인 : Source(RefPoint), Target(MeaPoint)
///
///
/// Stage 얼라인 : Source(MeaPoint), Target(RefPoint)
///
///
/// 이동 포인트
/// 고정 포인트
/// Y축 반전
/// 보정량 XYT
public static AlignDelta CalculateT_ICP(
List srcPoints,
List tgtPoints,
int flipY) {
var alignDeltaT = NativeAligner.AlignT_ICP(srcPoints, tgtPoints);
alignDeltaT.T = CoordSystem.DenormalizeAngleDirection(alignDeltaT.T, flipY);
return alignDeltaT;
}
///
/// Source(이동)를 Target(고정)에 맞추는 얼라인 XY
///
/// 이동 포인트 리스트
/// 고정 포인트 리스트
/// 보정량 XY
public static AlignDelta CalculateXY(
List srcPoints,
List tgtPoints) {
var alignDeltaXY = NativeAligner.AlignXY(srcPoints, tgtPoints);
return new AlignDelta(
alignDeltaXY.Translation,
Angle.CreateWithDegree(0));
}
#endregion
#region 1-Point Align
///
/// Source(이동)를 Target(고정)에 맞추는 얼라인 XYT
///
/// Head 얼라인 : Source(RefPoint), Target(MeaPoint)
///
///
/// Stage 얼라인 : Source(MeaPoint), Target(RefPoint)
///
///
/// 이동 포인트
/// 고정 포인트
/// 패턴 틀어진 각도 보정량
/// 회전 원점
/// Y축 반전
/// 보정량 XYT
public static AlignDelta CalculateXYT(
DoublePoint srcPoint,
DoublePoint tgtPoint,
Angle theta,
DoublePoint thetaOrigin,
int flipY) {
var rotatedSrcPoints = MathUtil.Rotate(
srcPoint,
CoordSystem.NormalizeAngleDirection(theta, flipY),
thetaOrigin);
AlignDelta alignDeltaXY = CalculateXY(rotatedSrcPoints, tgtPoint);
return new AlignDelta(alignDeltaXY.Translation, theta);
}
///
/// Source(이동)를 Target(고정)에 맞추는 얼라인 XY
///
/// 이동 포인트
/// 고정 포인트
/// 보정량 XY
public static AlignDelta CalculateXY(
DoublePoint srcPoint,
DoublePoint tgtPoint) {
var alignDeltaXY = NativeAligner.AlignXY(srcPoint, tgtPoint);
return new AlignDelta(
alignDeltaXY.Translation,
Angle.CreateWithDegree(0));
}
#endregion
}
}