/// <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); } }
/// <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]); } }