public IPoint OffSetPointForArrow(IPoint point, ConnectorDirectionEnum direction)
        {
            switch (direction)
            {
            case ConnectorDirectionEnum.Left:
                return(new Point(point.X + ARROW_LN, point.Y));

            case ConnectorDirectionEnum.Right:
                return(new Point(point.X - ARROW_LN, point.Y));

            case ConnectorDirectionEnum.Up:
                return(new Point(point.X, point.Y + ARROW_LN));

            case ConnectorDirectionEnum.Down:
                return(new Point(point.X, point.Y - ARROW_LN));
            }

            return(point);
        }
        public IEnumerable <IPoint> GenerateArrow(IPoint p, ConnectorDirectionEnum direction)
        {
            switch (direction)
            {
            case ConnectorDirectionEnum.Left:
                yield return(new Point(p.X, p.Y - ARROW_LN));

                yield return(new Point(p.X - ARROW_LN, p.Y));

                yield return(new Point(p.X, p.Y + ARROW_LN));

                break;

            case ConnectorDirectionEnum.Right:
                yield return(new Point(p.X, p.Y - ARROW_LN));

                yield return(new Point(p.X + ARROW_LN, p.Y));

                yield return(new Point(p.X, p.Y + ARROW_LN));

                break;

            case ConnectorDirectionEnum.Up:
                yield return(new Point(p.X - ARROW_LN, p.Y));

                yield return(new Point(p.X, p.Y - ARROW_LN));

                yield return(new Point(p.X + ARROW_LN, p.Y));

                break;

            case ConnectorDirectionEnum.Down:
                yield return(new Point(p.X - ARROW_LN, p.Y));

                yield return(new Point(p.X, p.Y + ARROW_LN));

                yield return(new Point(p.X + ARROW_LN, p.Y));

                break;
            }
        }
        private IEnumerable <IPoint> GeneratePath(IPoint start, IPoint end, ConnectorDirectionEnum dirStart, ConnectorDirectionEnum dirEnd)
        {
            yield return(start);

            if (dirStart == dirEnd)
            {
                if (dirStart == ConnectorDirectionEnum.Right || dirStart == ConnectorDirectionEnum.Left)
                {
                    var halfDeltaX = (end.X - start.X) / 2;
                    yield return(new Point(start.X + halfDeltaX, start.Y));

                    yield return(new Point(start.X + halfDeltaX, end.Y));
                }
                if (dirStart == ConnectorDirectionEnum.Up || dirStart == ConnectorDirectionEnum.Down)
                {
                    var halfDeltaY = (end.Y - start.Y) / 2;
                    yield return(new Point(start.X, start.Y + halfDeltaY));

                    yield return(new Point(end.X, start.Y + halfDeltaY));
                }
            }

            yield return(end);
        }