Beispiel #1
0
        /// <summary>
        /// 최소자승법으로 원 찾기.
        /// </summary>
        /// <param name="points">점 집합.</param>
        /// <returns></returns>
        private CvsCircle CalcLeastSquare(IEnumerable <Point> points)
        {
            // 계산방법
            // 1. 모든 수직이등분선의 교점을 구한다.
            // 2. 교점의 평균 값을 구하여 원 중점으로 설정한다.
            // 3. 중점에서 각 점 간의 거리를 구한다.
            // 4. 거리의 평균을 반지름으로 설정한다.

            double sum_x = 0, sum_y = 0;
            int    tmpCount = 0;

            //수직이등분선 구하기.
            for (int i = 0; i < points.Count() - 2; i++)
            {
                for (int j = i + 1; j < points.Count() - 1; j++)
                {
                    m_CornerDetect.LineA = this.CalcBisector(points.ElementAt(i), points.ElementAt(j));
                    for (int k = j + 1; k < points.Count(); k++)
                    {
                        m_CornerDetect.LineB = this.CalcBisector(points.ElementAt(i), points.ElementAt(k));
                        m_CornerDetect.Detect();

                        if (m_CornerDetect.Corner != null && m_CornerDetect.Corner.IntersectionAngle != 0)
                        {
                            sum_x += m_CornerDetect.Corner.Corner.X;
                            sum_y += m_CornerDetect.Corner.Corner.Y;
                            tmpCount++;
                        }
                    }
                }
            }

            //중심점 구하기
            var center = new Point(sum_x / tmpCount, sum_y / tmpCount);

            //중심점에서 거리 측정
            double sum_r = 0;

            foreach (var p in points)
            {
                sum_r += this.CalcRadius(center, p);
            }

            //반지름 구하기
            var radius = sum_r / points.Count();

            return(new CvsCircle(center, radius, points is Point[] ? (Point[])points : points.ToArray()));
        }
        /// <summary>
        /// 교점 검색을 시작합니다.
        /// </summary>
        public void Run()
        {
            try
            {
                if (InputImage == null)
                {
                    throw new Exception("Input image first.");
                }

                m_LineATool.InputImage = InputImage;
                m_LineBTool.InputImage = InputImage;

                m_LineATool.Run();
                m_LineBTool.Run();

                m_CornerDetect.LineA = m_LineATool.Line;
                m_CornerDetect.LineB = m_LineBTool.Line;
                m_CornerDetect.Detect();

                Corner = m_CornerDetect.Corner;

                Overlay = this.CreateGeometry();

                Exception = null;
            }
            catch (Exception err)
            {
                Exception = err;
            }
        }