FigLinkline.cs 2.07 KB
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace flowchart
{
    class FigLinkline
    {
        // 도형과 도형사이에 선을 연결하는 클래스

        private FigBase _startShape; // 링크 라인의 시작 위치
        private FigBase _endShape;   // 링크 라인의 종료 위치

        public FigLinkline(FigBase startShape, FigBase endShape)
        {
            _startShape = startShape;
            _endShape = endShape;
        }

        public void Draw(Graphics g)
        {
            using (Pen pen = new Pen(Color.Blue, 3f) { StartCap = LineCap.Round, EndCap = LineCap.Round })
            {
                Point[] pts = FindShortestLinkPoints();   // 두 도형의 최단거리를 계산하는 함수를 호출

                g.DrawLine(pen, pts[0], pts[1]);          // 실제 링크 라인을 처리
            }
        }

        // 시작 도형의 4개 점과 종료 도형의 4개 점의 거리를 구해서 최단거리를 리턴한다.
        private Point[] FindShortestLinkPoints()
        {
            double distance = Double.MaxValue;
            Point[] results = new Point[] { Point.Empty, Point.Empty };
            foreach (Point p1 in _startShape.LinkPoints)
            {
                foreach (Point p2 in _endShape.LinkPoints)
                {
                    double newDistance = GetDistance(p1, p2);  // 두점의 거리를 구하는 함수를 호출

                    if (newDistance < distance)
                    {
                        distance = newDistance;
                        results[0] = p1;
                        results[1] = p2;
                    }

                }
            }

            return results;
        }

        // 주어진 두점의 거리만 구해서 리턴한다.
        private double GetDistance(Point pt1, Point pt2)
        {
            double temp = Math.Pow(pt2.X - pt1.X, 2) + Math.Pow(pt2.Y - pt1.Y, 2);
            return Math.Sqrt(temp);
        }

    }
}