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