您现在的位置是:首页 >学无止境 >C#绘制三维坐标系网站首页学无止境

C#绘制三维坐标系

大浪淘沙胡 2025-03-26 00:01:02
简介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、运行结果
在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。