using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace Project.Class
{
    public class KeyenceBarcodeData
    {
        public double Angle { get; set; }
        public StdLabelPrint.CAmkorSTDBarcode AmkorData { get; set; }
        public Point[] vertex { get; set; }
        public string Data { get; set; }
        public Point CenterPX { get; set; }
        public string sym { get; set; }
        public Boolean UserActive { get; set; }
        public Boolean isSTDBarcode
        {
            get
            {
                if (AmkorData != null && sym == "1" && AmkorData.isValid) return true;
                return false;
            }
        }
        public Boolean isNewLen15
        {
            get
            {
                if (AmkorData != null && sym == "1" && AmkorData.isValid && AmkorData.NewLen15Barcode) return true;
                return false;
            }
        }
        /// 
        /// 라벨의 위치를 표시한다. 8방향이며 키패드 유사하게 설정한다 789/4-6/123
        /// 
        public byte LabelPosition { get; set; }
        public KeyenceBarcodeData()
        {
            LabelPosition = 0;
            Angle = 0.0;
            Data = string.Empty;
            CenterPX = Point.Empty;
            AmkorData = null;
            vertex = null;
            sym = string.Empty;
            UserActive = false;
        }
        public override string ToString()
        {
            return string.Format("{0},Deg={1},Center={2}x{3}", Data, Angle, CenterPX.X, CenterPX.Y);
        }
        /// 
        /// 해당 중심점이 겹치는지 확인합니다.
        /// 
        /// 
        /// 
        public Boolean CheckIntersect(Point Center, string data)
        {
            if (data.Equals(this.Data) == false) return false; //자료가 다르면 다른 자료로 처리한다
            return getInside(Center, vertex);
        }
        bool getInside(Point pt, Point[] ptArr)
        {
            int crosses = 0;
            for (int i = 0; i < ptArr.Length; i++)
            {
                int j = (i + 1) % ptArr.Length;
                if ((ptArr[i].Y > pt.Y) != (ptArr[j].Y > pt.Y))
                {
                    //atX는 점 B를 지나는 수평선과 선분 (p[i], p[j])의 교점
                    double atX = (ptArr[j].X - ptArr[i].X) * (pt.Y - ptArr[i].Y) / (ptArr[j].Y - ptArr[i].Y) + ptArr[i].X;
                    //atX가 오른쪽 반직선과의 교점이 맞으면 교점의 개수를 증가시킨다.
                    if (pt.X < atX)
                        crosses++;
                }
            }
            return crosses % 2 > 0;
        }
    }
}