Custom arrowhead

Sometimes we get queries about how to get certain arrowhead shapes. For example, the following link:

was defined by:

  [Serializable]
  public class Relationship : GoLink {
    public Relationship() {
      this.FromArrow = true;
      this.FromArrowFilled = false;
      this.FromArrowLength = 12;
      this.FromArrowShaftLength = 0;
      this.FromArrowStyle = GoStrokeArrowheadStyle.Cross;
      this.FromArrowWidth = 16;
      this.ToArrow = true;
      this.ToArrowFilled = false;
      this.ToArrowLength = 0;
      this.ToArrowShaftLength = 16;
      this.ToArrowWidth = 16;
    }

    protected override void DrawArrowhead(Graphics g, GoView view, Pen pen, Brush brush,
                                bool atEnd, float offsetw, float offseth, PointF[] poly) {
      if (atEnd) {
        GoShape.DrawLine(g, view, pen, poly[0].X, poly[0].Y, poly[1].X, poly[1].Y);
        GoShape.DrawLine(g, view, pen, poly[0].X, poly[0].Y, poly[2].X, poly[2].Y);
        GoShape.DrawLine(g, view, pen, poly[0].X, poly[0].Y, poly[3].X, poly[3].Y);
        GoShape.DrawEllipse(g, view, pen, Brushes.White, poly[0].X-10, poly[0].Y-5, 10, 10);
      } else {
        base.DrawArrowhead(g, view, pen, brush, atEnd, offsetw, offseth, poly);
      }
    }
  }
The left side ("From" end) arrowhead is just a matter of setting the various "From..." properties.
The right side ("To" end) arrowhead requires overriding DrawArrowhead.