您现在的位置是:首页 >学无止境 >C#绘制三维坐标系网站首页学无止境
C#绘制三维坐标系
简介C#绘制三维坐标系
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));
}
#endregion
protected 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、运行结果
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。