当前位置:编程学习 > C#/ASP.NET >>

我想用c#中的winform根据坐标画图,就是一条直线,请求帮小弟一下啊!

    小弟的问题:
    
     想用图形学的知识,在winform中用c#画出一个类似铁路线的那种线路图,例如每个站点的坐标能够知道,那么怎么用一种算法,能够成为一个画成每两个点连接起来之后是一条直线,那么好多的两个点连接起来就能够成为一条连续的直线了。
     这个算法用c#语言应该怎么样去写呢?

     已经写了这几个方法了:
        //画直线的方法
        public void drawLine(Point startpoint, Point endpoint)
        {

            Graphics graphics = this.CreateGraphics();
            graphics.DrawLine(new Pen(new SolidBrush(Color.Red), 5), startpoint.X, startpoint.Y, endpoint.X, endpoint.Y);
            graphics.Dispose();
        }
       //计算所有直线上经过的点,Transfer.TransNet 这个是一个动态连接库,返回站点的在地图上的坐标值
            Transfer.TransNet trasf = new Transfer.TransNet();
            string[] coordinates = Tools.Text.Util.RegexMultiFilter(@"\d+,\d+", trasf.Transfer(ref szStartStation, ref this.selected_station));

            this.corners = new Point[coordinates.Length];

            for (int i = 0; i < coordinates.Length; i++)
            {
                string coordinate = coordinates[i];
                string[] xy = Tools.Text.Util.RegexMultiFilter(@"\d+", coordinate);

                Point point = new Point(Convert.ToInt32(xy[0]), Convert.ToInt32(xy[1]));
                this.corners[i] = point;
            }

      帮我参考一下怎么样能够写出一个算法,能够让这个直线画出来,就是要好几个站点连接呢?还是说就是知道首尾的坐标值就可以啊?请哥哥姐姐们赐教!跪拜!
        --------------------编程问答-------------------- 可以回吗 --------------------编程问答-------------------- ssssssssss --------------------编程问答-------------------- dddddddddd --------------------编程问答-------------------- BUG --------------------编程问答-------------------- BUG --------------------编程问答-------------------- 我说重点吧。
重写OnMouseDown方法,把鼠标点击的坐标记录到List里。
重写OnPaint方法,当List数量大于1时,就两个两个坐标读出来画出直线。
你自己先试一下,如果不行就电邮给我,我发个范例给你。 --------------------编程问答-------------------- graphics.DrawLines()直接绘制不行么? --------------------编程问答-------------------- 我在
DateGreadView中用graphics.DrawLines()
画轴试图都行啊  --------------------编程问答-------------------- 不知,帮顶 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用楼主 daijia1984 的帖子:
//计算所有直线上经过的点,Transfer.TransNet 这个是一个动态连接库,返回站点的在地图上的坐标值
            Transfer.TransNet trasf = new Transfer.TransNet();
            string[] coordinates = Tools.Text.Util.RegexMultiFilter(@"\d+,\d+", trasf.Transfer(ref szStartStation, ref this.selected_station));

            this.corners = new Point[coordinates.Length];

            for (int i = 0; i  < coordinates.Length; i++)
            {
                string coordinate = coordinates[i];
                string[] xy = Tools.Text.Util.RegexMultiFilter(@"\d+", coordinate);

                Point point = new Point(Convert.ToInt32(xy[0]), Convert.ToInt32(xy[1]));
                this.corners[i] = point;
            } 


你这个动态链接库返回的是corners吗?
把这么点转成一条条的直线,声明GraphicsPath,把这些直线加进去,再绘制GraphicsPath --------------------编程问答-------------------- 按住Ctrl 连继按鼠标描点,完成后显示路径的例子。根据你自己的要求再修改程序吧。


    public partial class LineForm : Form
    {
        public LineForm()
        {
            InitializeComponent();
        }

        private bool m_addPoint = false;

        //所有保存的绘画线
        private List<Line> m_lines = new List<Line>();
        //当前绘画线
        private Line m_line = new Line();

        protected override void OnPaint(PaintEventArgs e)
        {
            for (int i = 0; i < m_lines.Count; i++)
            {
                m_lines[i].Draw(e.Graphics);
            }
            base.OnPaint(e);
        }

        protected override void OnMouseClick(MouseEventArgs e)
        {
            if (m_addPoint)
            {
                if (m_line != null)
                {
                    m_line.AddPoint(e.Location);
                }
            }
            base.OnMouseClick(e);
        }

        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (e.Control)
            {
                m_addPoint = true;
            }
            base.OnKeyDown(e);
        }

        protected override void OnKeyUp(KeyEventArgs e)
        {
            if (m_addPoint)
            {
                m_addPoint = false;
                if (m_line != null)
                {
                    m_lines.Add(m_line);
                    m_line = new Line();
                }
                Invalidate(true);
            }
            base.OnKeyUp(e);
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }

    public class Line : CollectionBase
    {
        private Pen m_pen = new Pen(new SolidBrush(Color.Red));

        public void AddPoint(Point p)
        {
            base.List.Add(p);
        }

        public void Draw(Graphics g)
        {
            if (this.Count >= 2)
            {
                Point p = (Point)this.List[0];

                for (int i = 1; i < this.List.Count; i++)
                {
                    g.DrawLine(m_pen, p, (Point)this.List[i]);

                    p = (Point)this.List[i];
                }
            }
        }
        public Color LineColor
        {
            get
            {
                return m_pen.Color;
            }
            set
            {
                m_pen.Color = value;
            }
        }
    }
--------------------编程问答--------------------
引用 13 楼 atgo 的回复:
按住Ctrl 连继按鼠标描点,完成后显示路径的例子。根据你自己的要求再修改程序吧。


C# code

    public partial class LineForm : Form
    {
        public LineForm()
        {
            InitializeComponent();
        }

      ……


顶 --------------------编程问答-------------------- GDI+我用过 你要静态的还是动态的?
补充:.NET技术 ,  组件/控件开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,