Пример #1
0
        /// <summary>
        /// Draw connection (i.e. line with triangle) to specific graphics object.
        /// </summary>
        /// <param name="windowPosition">Position of window described by graphics object in composition area.</param>
        /// <param name="g">Graphics where connection should be drawn.</param>
        public void Draw(Point windowPosition, Graphics g)
        {
            float startX = _providingModel.GetMidPoint().X;
            float startY = _providingModel.GetMidPoint().Y;
            float endX   = _acceptingModel.GetMidPoint().X;
            float endY   = _acceptingModel.GetMidPoint().Y;

            // calculate triangle point in area points and store them internally
            _trianglePoints = GetTrianglePoints(startX, startY, endX, endY);

            // recalculate trinagle points so they correspond to window and can be draw
            Point[] windowTrianglePoints = new Point[3];
            for (int i = 0; i < 3; i++)
            {
                windowTrianglePoints[i].X = _trianglePoints[i].X - windowPosition.X;
                windowTrianglePoints[i].Y = _trianglePoints[i].Y - windowPosition.Y;
            }

            // modify start and end so they correspond to window
            startX -= windowPosition.X;
            startY -= windowPosition.Y;
            endX   -= windowPosition.X;
            endY   -= windowPosition.Y;

            g.DrawLine(linePen, startX, startY, endX, endY);

            // we draw the triangle only the link is at least 10 pixels
            if (Math.Abs(startX - endX) + Math.Abs(startY - endY) > 10)
            {
                g.FillPolygon(Brushes.Blue, windowTrianglePoints, System.Drawing.Drawing2D.FillMode.Alternate);
                g.DrawPolygon(Pens.Red, windowTrianglePoints);
            }
        }
Пример #2
0
        /// <summary>
        /// Draw connection (i.e. line with triangle) to specific graphics object.
        /// </summary>
        /// <param name="windowPosition">Position of window described by graphics object in composition area.</param>
        /// <param name="g">Graphics where connection should be drawn.</param>
        public Point[] Draw(Point windowPosition, Graphics g)
        {
            Pen arrowPen = new Pen(Color.Black, 1.6F);

            float startX = _providingModel.GetMidPoint().X;
            float startY = _providingModel.GetMidPoint().Y;
            float endX   = _acceptingModel.GetMidPoint().X;
            float endY   = _acceptingModel.GetMidPoint().Y;



            // calculate triangle point in area points and store them internally
            _trianglePoints = GetTrianglePoints(startX, startY, endX, endY);

            // recalculate trinagle points so they correspond to window and can be draw
            Point[] windowTrianglePoints = new Point[3];
            for (int i = 0; i < 3; i++)
            {
                windowTrianglePoints[i].X = _trianglePoints[i].X - windowPosition.X;
                windowTrianglePoints[i].Y = _trianglePoints[i].Y - windowPosition.Y;
            }

            // modify start and end so they correspond to window
            startX -= windowPosition.X;
            startY -= windowPosition.Y;
            endX   -= windowPosition.X;
            endY   -= windowPosition.Y;

            //draw curved line
            Point[] lineArray = new Point[4];
            lineArray[0] = new Point((int)startX, (int)startY);
            lineArray[1] = new Point((int)startX - (((int)startX - (int)endX) / 3), (int)startY);
            lineArray[2] = new Point((int)endX - (((int)endX - (int)startX) / 3), (int)endY);
            lineArray[3] = new Point((int)endX, (int)endY);

            //Point[] lineArray2 = new Point[4];
            //lineArray2[0] = new Point((int)startX, (int)startY);
            //lineArray2[1] = new Point((int)startX + (int)((endX - startX) / 4), (int)startY);
            //lineArray2[2] = new Point((int)startX + (int)((endX - startX) / 2), (int)startY + (int)((endY - startY)/2));
            //lineArray2[2] = new Point((int)startX + (int)((endX - startX) * 0.75), (int)endY);
            //lineArray2[3] = new Point((int)startX + (int)((endX - startX)), (int)endY);
            //g.DrawCurve(new Pen(Color.Red, 1.5F), lineArray2);
            //_arrowPath.AddCurve(lineArray2);

            LinearGradientBrush brush = new LinearGradientBrush(lineArray[0], lineArray[3], Color.WhiteSmoke, Color.Black);

            //Blend blend = new Blend();
            //blend.Factors = new float[] { 0.0f, 0.1f, 0.3f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1f, 1f, 1f };
            //blend.Positions = new float[] { 0, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f };
            //brush.Blend = blend;

            arrowPen = new Pen(brush, 1.6F);

            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.DrawBeziers(arrowPen, lineArray);
            _arrowPath.AddBeziers(lineArray);
            _arrowPath.Flatten();

            //g.DrawLine(linePen, startX, startY, endX, endY);

            if (Math.Abs(startX - endX) + Math.Abs(startY - endY) > 10)
            {
                return(windowTrianglePoints);
            }
            else
            {
                return(new Point[0]);
            }
        }