2012-10-06 61 views
0

在Visual Studio 2010 IDE中使用C#窗体窗体上的图表控件。无法在Windows窗体图表控件上绘制线条

我正在创建绘制随机点的图表。一旦生成点,我为图表中的每个点运行一个循环,查看所有其他点坐标。在该循环内,我计算从父点到它的邻居的距离。如果距离是< =我指定的某个距离,我想绘制一条线显示两者之间的连接。我遇到的问题实际上是绘制该线。此外,我需要找到一种方法来走这条图表中的最短路径。

所以这真的是两个问题: 1.如何绘制图表上的线条? (目前的困境) 2.我如何走图找到最短路径?

这里是我使用来完成此些码的剪断,与当前的误差沿着:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    public void createNodes(int x, int y, int Nodes, int dgNodes) 
    { 
     Random rdn = new Random(); 

     for (int i = 0; i < (Nodes - dgNodes); i++) 
     { 
      chtGraph.Series["Series1"].Points.AddXY 
         (rdn.Next(x), rdn.Next(y)); 
     } 

     for (int i = 0; i <= dgNodes - 1; i++) 
     { 
      chtGraph.Series["Series2"].Points.AddXY 
         (rdn.Next(x), rdn.Next(y)); 
     } 
    } 

    public void buildGraph(int x, int y, int Nodes, int dgNodes) 
    { 
     //set the min/max axis on the chart 
     chtGraph.ChartAreas["ChartArea1"].AxisX.Maximum = x; 
     chtGraph.ChartAreas["ChartArea1"].AxisX.Minimum = 0; 
     chtGraph.ChartAreas["ChartArea1"].AxisY.Maximum = y; 
     chtGraph.ChartAreas["ChartArea1"].AxisY.Minimum = 0; 
     chtGraph.ChartAreas["ChartArea1"].AxisX.Interval = x/10; 
     chtGraph.ChartAreas["ChartArea1"].AxisY.Interval = y/10; 

     chtGraph.ChartAreas["ChartArea1"].AxisX.MajorGrid.Enabled = false; 
     chtGraph.ChartAreas["ChartArea1"].AxisY.MajorGrid.Enabled = false; 

     //build all the nodes 
     createNodes(x, y, Nodes, dgNodes); 
    } 

    public void drawEdges(int intNumNodes, int intTransPower) 
    { 

     Pen pen = new Pen(Color.Black, 1); 
     Graphics g = chtGraph.CreateGraphics(); 

     Point[] pts = new Point[intNumNodes]; 
     int i = 0; 

     //Gather all the data generator data points into a point array 
     foreach (DataPoint p in chtGraph.Series[0].Points) 
     { 
      Point point = new Point((int)p.XValue, (int)p.YValues[0]); 
      pts[i] = point; 
      i++; 
     } 

     //Gather all the non data generator into the same point array 
     foreach (DataPoint p in chtGraph.Series[1].Points) 
     { 
      Point point = new Point((int)p.XValue, (int)p.YValues[0]); 
      pts[i] = point; 
      i++; 
     } 

     //loop through all the data points 
     foreach (Point p in pts) 
     { 
      //examine all the other data points for each data point visited 
      for (int j = 0; j < pts.Length; j++) 
      { 

       //if the distance from the parent node (p) to the neighbor node is less than the transmit power, then draw a line 
       if (Math.Sqrt(Math.Pow((p.X - pts[j].X), 2) + Math.Pow((p.Y - pts[j].Y), 2)) <= intTransPower) 
       { 
        //gr.DrawLine(pen, p, pts[j]); 
        //gr.Graphics.DrawLine(pen, p.X, p.Y, pts[j].X, pts[j].Y); 

       } 
      } 
     } 
    } 

    private void btnExecute_Click(object sender, EventArgs e) 
    { 
     if (txtDG.Text == "" || txtNodes.Text == "" || txtStorage.Text == "" || txtTransPower.Text == "" 
      || txtXAxis.Text == "" || txtXAxis.Text == "") 
     { 
      lblError.Text = "Please enter in all inputs!"; 
      lblError.Visible = true; 
      return; 
     } 
     //create variables for use through program 

     int intTransPower = Convert.ToInt32(txtTransPower.Text); 
     int intXAxis = Convert.ToInt32(txtXAxis.Text); 
     int intYAxis = Convert.ToInt32(txtYAxis.Text); 
     int intNum_DG = Convert.ToInt32(txtDG.Text); 
     int intNumNodes = Convert.ToInt32(txtNodes.Text); 
     int intStorage = Convert.ToInt32(txtStorage.Text); 

     lblError.Visible = false; 
     lblError.Text = ""; 

     if (txtDG.Text == "" || txtNodes.Text == "" || txtStorage.Text == "" || txtTransPower.Text == "" 
      || txtXAxis.Text == "" || txtXAxis.Text == "") 
     { 
     lblError.Text = "Please enter in all inputs!"; 
     lblError.Visible = true;} 

     chtGraph.Series["Series1"].Points.Clear(); 
     chtGraph.Series["Series2"].Points.Clear(); 

     buildGraph(intXAxis, intYAxis, intNumNodes, intNum_DG); 

     drawEdges(intNumNodes, intTransPower); 
    } 

} 

错误:错误1类型“System.Windows.Forms.DataVisualization.Charting.ChartGraphics '没有构造函数定义

+0

这是图表控件的工作。如果您想绘制任何额外的内容,请为其PostPaint事件编写一个事件处理程序。它e.ChartGraphics成员给你你正在寻找的图形对象。 –

+0

谢谢...这就像一个魅力! – dvsoukup

回答

1

在问题的评论中描述了使用的事件。