2026-01-26 18:56:53 +09:00

122 lines
3.5 KiB
C#

/*
* 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 {
/// <summary>
/// 원점, 각도, 길이로 구성되는 십자가
/// </summary>
public class Cross : ICloneable {
private const int DEFAULT_LENGTH = 50;
/// <summary>원점</summary>
public ImagePoint Origin { get; set; }
/// <summary>각도</summary>
public Angle Angle { get; set; }
/// <summary>수직/수평 길이</summary>
public double Length { get; set; }
/// <summary>수직 라인</summary>
public Line<ImagePoint> VerticalLine {
get {
var offset = new ImagePoint(Length, 0);
var p1 = Origin - offset;
var p2 = Origin + offset;
return new Line<ImagePoint>(
MathUtil.Rotate(p1, Angle, Origin) as ImagePoint,
MathUtil.Rotate(p2, Angle, Origin) as ImagePoint);
}
}
/// <summary>수평 라인</summary>
public Line<ImagePoint> HorizontalLine {
get {
var offset = new ImagePoint(0, Length);
var p1 = Origin - offset;
var p2 = Origin + offset;
return new Line<ImagePoint>(
MathUtil.Rotate(p1, Angle, Origin) as ImagePoint,
MathUtil.Rotate(p2, Angle, Origin) as ImagePoint);
}
}
/// <summary>
/// 생성자
/// </summary>
/// <param name="origin">원점</param>
public Cross(ImagePoint origin)
: this(origin, new Angle(), DEFAULT_LENGTH) {
}
/// <summary>
/// 생성자
/// </summary>
/// <param name="origin">원점</param>
/// <param name="length">수직/수평 길이</param>
public Cross(ImagePoint origin, double length)
: this(origin, new Angle(), length) {
}
/// <summary>
/// 생성자
/// </summary>
/// <param name="origin">원점</param>
/// <param name="angle">각도</param>
public Cross(ImagePoint origin, Angle angle)
: this(origin, angle, DEFAULT_LENGTH) {
}
/// <summary>
/// 생성자
/// </summary>
/// <param name="origin">원점</param>
/// <param name="angle">각도</param>
/// <param name="length">수직/수평 길이</param>
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);
}
}
}