/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace VisionCommon { /// /// 원점, 각도, 길이로 구성되는 십자가 /// public class Cross : ICloneable { private const int DEFAULT_LENGTH = 50; /// 원점 public ImagePoint Origin { get; set; } /// 각도 public Angle Angle { get; set; } /// 수직/수평 길이 public double Length { get; set; } /// 수직 라인 public Line VerticalLine { get { var offset = new ImagePoint(Length, 0); var p1 = Origin - offset; var p2 = Origin + offset; return new Line( MathUtil.Rotate(p1, Angle, Origin) as ImagePoint, MathUtil.Rotate(p2, Angle, Origin) as ImagePoint); } } /// 수평 라인 public Line HorizontalLine { get { var offset = new ImagePoint(0, Length); var p1 = Origin - offset; var p2 = Origin + offset; return new Line( MathUtil.Rotate(p1, Angle, Origin) as ImagePoint, MathUtil.Rotate(p2, Angle, Origin) as ImagePoint); } } /// /// 생성자 /// /// 원점 public Cross(ImagePoint origin) : this(origin, new Angle(), DEFAULT_LENGTH) { } /// /// 생성자 /// /// 원점 /// 수직/수평 길이 public Cross(ImagePoint origin, double length) : this(origin, new Angle(), length) { } /// /// 생성자 /// /// 원점 /// 각도 public Cross(ImagePoint origin, Angle angle) : this(origin, angle, DEFAULT_LENGTH) { } /// /// 생성자 /// /// 원점 /// 각도 /// 수직/수평 길이 public Cross(ImagePoint origin, Angle angle, double length) { Origin = origin; Angle = angle; Length = length; } public override bool Equals(object obj) { return Equals(obj as Cross); } public bool Equals(Cross cross) { if (cross is null) { return false; } if (Object.ReferenceEquals(this, cross)) { return true; } return this.Origin.Equals(cross.Origin) && this.Angle.Equals(cross.Angle) && this.Length == cross.Length; } public override int GetHashCode() { return Origin.GetHashCode() ^ Angle.GetHashCode() ^ Length.GetHashCode(); } public object Clone() { return new Cross( Origin.Clone() as ImagePoint, Angle.Clone() as Angle, Length); } } }