/* * 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 } }