1、代码
#region 三维坐标系的绘制private int axisLength=30;[Category("坐标系")][Description("轴长")]public int AxisLength{get { return axisLength; }set { if(value>30) axisLength = value; }}private int axisGap=10;[Category("坐标系")][Description("边距")]public int AxisGap{get { return axisGap; }set { axisGap = value; }}private string axisNameX = "X";[Category("坐标系")][Description("X轴")]public string AxisNameX{get { return axisNameX; }set { axisNameX = value; }}private string axisNameY = "Y";[Category("坐标系")][Description("Y轴")]public string AxisNameY{get { return axisNameY; }set { axisNameY = value; }}private string axisNameZ = "Z";[Category("坐标系")][Description("Z轴")]public string AxisNameZ{get { return axisNameZ; }set { axisNameZ = value; }}private Font axisFont=new Font("黑体",9,FontStyle.Bold);[Category("坐标系")][Description("字体")]public Font AxisFont{get { return axisFont; }set { axisFont = value; }}private Pen axisPen = new Pen(Color.Black, 2);[Category("坐标系")][Description("画笔")]public Pen AxisPen{get { return axisPen; }set { axisPen = value; }}private Brush axisBrush = new SolidBrush(Color.Black);[Category("坐标系")][Description("画刷")]public Brush AxisBrush{get { return axisBrush; }set { axisBrush = value; }}/// <summary>/// 绘制三维坐标系/// </summary>/// <param name="g"></param>/// <param name="userScreen"></param>public void CoordinateDraw(Graphics g, Size userScreen){int temp = axisGap + (int)(axisLength / 1.414);Point coordinateOrigion = new Point(temp, userScreen.Height - temp);Point originX = new Point(temp + axisLength, userScreen.Height - temp);Point originY = new Point(temp, userScreen.Height - temp - axisLength);Point originZ = new Point(axisGap, userScreen.Height - axisGap);DrawLineWithArrow(g, axisPen, coordinateOrigion, originX, 10);DrawLineWithArrow(g, axisPen, coordinateOrigion, originY, 10);DrawLineWithArrow(g, axisPen, coordinateOrigion, originZ, 10);SizeF size = g.MeasureString(axisNameX, axisFont);g.DrawString(axisNameX, axisFont, axisBrush, new Point(originX.X - (int)size.Width, originX.Y + 5));g.DrawString(axisNameY, axisFont, axisBrush, new Point(originY.X + 5, originY.Y));size = g.MeasureString(axisNameZ, axisFont);g.DrawString(axisNameZ, axisFont, axisBrush, new Point(originZ.X, originZ.Y - (int)size.Height - 10));}#endregionprotected override void OnPaint(PaintEventArgs e){base.OnPaint(e);Graphics g = e.Graphics;Size userScreen = new Size(e.ClipRectangle.Width, e.ClipRectangle.Height);CoordinateDraw(g, userScreen);}/// <summary>/// 绘制带箭头线/// </summary>/// <param name="g"></param>/// <param name="pen"></param>/// <param name="start"></param>/// <param name="end"></param>/// <param name="arrowSize"></param>public static void DrawLineWithArrow(Graphics g, Pen pen, PointF start, PointF end, float arrowSize = 10){g.DrawLine(pen, start, end);if (arrowSize > 0){DrawArrow(g, pen, start, end, arrowSize);}}/// <summary>/// 绘制带箭头线的箭头/// </summary>/// <param name="g">GDI+绘图</param>/// <param name="pen">画笔</param>/// <param name="start">起始点</param>/// <param name="end">结束点</param>/// <param name="arrowSize">箭头大小</param>public static void DrawArrow(Graphics g, Pen pen, PointF start, PointF end, float arrowSize = 10){// 计算线的角度float angle = (float)Math.Atan2(end.Y - start.Y, end.X - start.X);// 箭头起点和终点PointF arrowStart = end;PointF arrowEnd1 = new PointF(end.X - arrowSize * (float)Math.Cos(angle - Math.PI / 6),end.Y - arrowSize * (float)Math.Sin(angle - Math.PI / 6));PointF arrowEnd2 = new PointF(end.X - arrowSize * (float)Math.Cos(angle + Math.PI / 6),end.Y - arrowSize * (float)Math.Sin(angle + Math.PI / 6));// 绘制箭头g.DrawLine(pen, arrowStart, arrowEnd1);g.DrawLine(pen, arrowStart, arrowEnd2);}
2、运行结果