C# 画坐标,graphics,C# 坐标自定义X轴、Y轴

原创 2012年08月27日 21:08:02

先看效果:

其中X轴,Y轴都是可以自定义的,可以从零开始,也可以从任意位置开始。

看坐标的画法:,

下面通过五个函数,来分别说明,注意这里坐标的定位是通过外层的Panel来实现的。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace PointToPic
{
    class XYLinesFactory
    {
        #region   画出X轴与Y轴
        /// <summary>
        /// 在任意的panel里画一个坐标,坐标所在的四边形距离panel边50像素
        /// </summary>
        /// <param name="pan"></param>
        public static void DrawXY(Panel pan)
        {
            Graphics g = pan.CreateGraphics();
            //整体内缩move像素
            float move = 50f;
            float newX = pan.Width - move;
            float newY = pan.Height - move;

            //绘制X轴,
            PointF px1 = new PointF(move, newY);
            PointF px2 = new PointF(newX, newY);
            g.DrawLine(new Pen(Brushes.Black, 2), px1, px2);
            //绘制Y轴
            PointF py1 = new PointF(move, move);
            PointF py2 = new PointF(move, newY);

            g.DrawLine(new Pen(Brushes.Black, 2), py1, py2);
        }
        #endregion

        /// <summary>
        /// 画出Y轴上的分值线,从零开始
        /// </summary>
        /// <param name="pan"></param>
        /// <param name="maxY"></param>
        /// <param name="len"></param>
        #region   画出Y轴上的分值线,从零开始
        public static void DrawYLine(Panel pan, float maxY, int len)
        {
            float move = 50f;
            float LenX = pan.Width - 2 * move;
            float LenY = pan.Height - 2 * move;
            Graphics g = pan.CreateGraphics();
            for (int i = 0; i <= len; i++)    //len等份Y轴
            {
                PointF px1 = new PointF(move, LenY * i / len + move);
                PointF px2 = new PointF(move + 4, LenY * i / len + move);
                string sx = (maxY - maxY * i / len).ToString();
                g.DrawLine(new Pen(Brushes.Black, 2), px1, px2);
                StringFormat drawFormat = new StringFormat();
                drawFormat.Alignment = StringAlignment.Far;
                drawFormat.LineAlignment = StringAlignment.Center;
                g.DrawString(sx, new Font("宋体", 8f), Brushes.Black, new PointF(move / 1.2f, LenY * i / len + move*1.1f ), drawFormat);
            }
            Pen pen = new Pen(Color.Black, 1);
            g.DrawString("Y轴", new Font("宋体 ", 10f), Brushes.Black, new PointF(move / 3, move / 2f));
        }
        #endregion

        /// <summary>
        /// 画出Y轴上的分值线,从任意值开始
        /// </summary>
        /// <param name="pan"></param>
        /// <param name="minY"></param>
        /// <param name="maxY"></param>
        /// <param name="len"></param>
        #region   画出Y轴上的分值线,从任意值开始
        public static void DrawYLine(Panel pan, float minY, float maxY, int len)
        {
            float move = 50f;
            float LenX = pan.Width - 2 * move;
            float LenY = pan.Height - 2 * move;
            Graphics g = pan.CreateGraphics();
            for (int i = 0; i <= len; i++)    //len等份Y轴
            {
                PointF px1 = new PointF(move, LenY * i / len + move);
                PointF px2 = new PointF(move + 4, LenY * i / len + move);
                string sx = (maxY - (maxY - minY) * i / len).ToString();
                g.DrawLine(new Pen(Brushes.Black, 2), px1, px2);
                StringFormat drawFormat = new StringFormat();
                drawFormat.Alignment = StringAlignment.Far;
                drawFormat.LineAlignment = StringAlignment.Center;
                g.DrawString(sx, new Font("宋体", 8f), Brushes.Black, new PointF(move / 1.2f, LenY * i / len + move * 1.1f), drawFormat);
            }
            Pen pen = new Pen(Color.Black, 1);
            g.DrawString("Y轴", new Font("宋体 ", 10f), Brushes.Black, new PointF(move / 3, move / 2f));
        }

        #endregion
        /// <summary>
        /// 画出X轴上的分值线,从零开始
        /// </summary>
        /// <param name="pan"></param>
        /// <param name="maxX"></param>
        /// <param name="len"></param>
        #region   画出X轴上的分值线,从零开始
        public static void DrawXLine(Panel pan, float maxX, int len)
        {
            float move = 50f;
            float LenX = pan.Width - 2 * move;
            float LenY = pan.Height - 2 * move;
            Graphics g = pan.CreateGraphics();
            for (int i = 1; i <= len; i++)
            {
                PointF py1 = new PointF(LenX * i / len + move, pan.Height - move - 4);
                PointF py2 = new PointF(LenX * i / len + move, pan.Height - move);
                string sy = (maxX * i / len).ToString();
                g.DrawLine(new Pen(Brushes.Black, 2), py1, py2);
                g.DrawString(sy, new Font("宋体", 8f), Brushes.Black, new PointF(LenX * i / len + move, pan.Height - move / 1.1f));
            }
            Pen pen = new Pen(Color.Black, 1);
            g.DrawString("X轴", new Font("宋体 ", 10f), Brushes.Black, new PointF(pan.Width - move /1.5f, pan.Height - move / 1.5f));
        }
        #endregion

        #region   画出X轴上的分值线,从任意值开始
        /// <summary>
        /// 画出X轴上的分值线,从任意值开始
        /// </summary>
        /// <param name="pan"></param>
        /// <param name="minX"></param>
        /// <param name="maxX"></param>
        /// <param name="len"></param>
        public static void DrawXLine(Panel pan, float minX, float maxX, int len)
        {
            float move = 50f;
            float LenX = pan.Width - 2 * move;
            float LenY = pan.Height - 2 * move;
            Graphics g = pan.CreateGraphics();
            for (int i = 0; i <= len; i++)
            {
                PointF py1 = new PointF(LenX * i / len + move, pan.Height - move - 4);
                PointF py2 = new PointF(LenX * i / len + move, pan.Height - move);
                string sy = ((maxX - minX) * i / len + minX).ToString();
                g.DrawLine(new Pen(Brushes.Black, 2), py1, py2);
                g.DrawString(sy, new Font("宋体", 8f), Brushes.Black, new PointF(LenX * i / len + move, pan.Height - move / 1.1f));
            }
            Pen pen = new Pen(Color.Black, 1);
            g.DrawString("X轴", new Font("宋体 ", 10f), Brushes.Black, new PointF(pan.Width - move / 1.5f, pan.Height - move / 1.5f));
        }
        #endregion

    }
}


调用部分:一个主窗体,里面放一个Panel,就可以调用了:这里的Panel的名字是pnlPic,然后写她的Paint事件就可以了

  private void pnlPic_Paint(object sender, PaintEventArgs e)
        {   
            XYLinesFactory.DrawXY(pnlPic);
            XYLinesFactory.DrawYLine(pnlPic, 3, 4, 5);
            XYLinesFactory.DrawXLine(pnlPic, 1.2f, 8);
        }


 

C#画坐标系(借鉴同学的)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T...
  • u010763324
  • u010763324
  • 2014年11月01日 18:46
  • 811

C#中做图坐标系变换的一个例子及源码

  • 2009年05月20日 15:34
  • 66KB
  • 下载

vs2010 c# graphics绘制坐标系

在txt文件里写入坐标,绘制图形。 鼠标位于坐标系内,显示2条红色十字线,和坐标值,离开坐标系,2者消失。...
  • xingkong886
  • xingkong886
  • 2017年03月28日 15:54
  • 3419

vs2010 c# graphics 坐标系画曲线

坐标为每10s传感器采集的数据 代码:using System; using System.Collections; using System.Collections.Generic; using ...
  • xingkong886
  • xingkong886
  • 2017年07月31日 15:51
  • 1365

c# 画直线,曲线和坐标图

  • 2009年02月11日 10:00
  • 103KB
  • 下载

c#画线Graphics

简单的画线,郁闷了我好几天 在panel和pictureBox中的画法都是一样的 public void pictureBox1_ht()//画图的简单方法{      Graphics g = pi...
  • small5e4444
  • small5e4444
  • 2011年05月17日 10:06
  • 4852

C#CreateGraphics方法的三种实现方式

方法一、利用控件或窗体的Paint事件中的PainEventArgs 在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEventArgs(PaintEventArgs指定绘制控件所...
  • Solo95
  • Solo95
  • 2016年04月25日 10:30
  • 1295

[C#] Graphics平移缩放旋转

【平移】 private void btnTranslate_Click(object sender, EventArgs e) { Graphics gra...
  • SunnyYoona
  • SunnyYoona
  • 2014年12月30日 21:00
  • 3619

C#中如何得到Graphics对象

利用Graphics对象,我们可以绘制理想的UI。这里首先介绍C#中如何得到Graphics对象。/如何得到Graphics对象1. Control.CreateGraphics();直接通过Cont...
  • xyz_lmn
  • xyz_lmn
  • 2009年09月29日 10:16
  • 6131

C#中Graphics的画图代码【转】

我要写多几个字上去 string str = "Baidu"; //写什么字? Font font = Font("宋体",30f); //字是什么样子的? Brush brush = ...
  • SunCherryDream
  • SunCherryDream
  • 2014年02月28日 21:08
  • 1080
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 画坐标,graphics,C# 坐标自定义X轴、Y轴
举报原因:
原因补充:

(最多只允许输入30个字)