1

特定の頂点間にいくつかのエッジを描画するグラフを作成しようとしています。アイデアは、ランダムな頂点を作成し、「送信電力」の整数を指定することです。2 つのノード間の距離が送信電力以下の場合、ノード間に線が引かれます。

これを行うために MSDN チャート コントロールを使用しています。ただし、線を引くのに問題があります。次のエラー メッセージが表示され続けます。

Error   2   Argument 2: cannot convert from 'System.Windows.Forms.DataVisualization.Charting.DataPoint' to 'System.Drawing.Point'   

これをクラックしようとしていたので、ここにログオンして、他の誰かがここで何をすべきかを知っているかどうかを確認しようと考えました. これを変換する方法については何も見つかりません。

コード例を次に示します。

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["NoDG"].Points.AddXY
                        (rdn.Next(x), rdn.Next(y));
        }

        for (int i = 0; i <= dgNodes - 1; i++)
        {
            chtGraph.Series["DG"].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)
    {
        ChartGraphics gr = new ChartGraphics();
        Pen pen = new Pen(Color.Black, 1);
        //System.Drawing.Point[] pts = new Point[4];
        //pts[0] = new Point(20, 20);
        //pts[1] = new Point(20, 140);
        //pts[2] = new Point(60, 60);
        //pts[3] = new Point(180, 80);
        //gr.DrawLine(pen, pts[1], pts[2]);

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

        //Gather all the data points into an array
        foreach (DataPoint p in chtGraph.Series[0].Points)
        {
            pts[i] = p;
            i++;
        }

        i = 0;

        //loop through all the data points
        foreach (DataPoint p in pts)
        {
            //examine all the other data points for each data point visited
            for (int j = 0; j < pts.Length; j++)
            {
                //convert the y values
                int yval = Convert.ToInt32(p.YValues[0]);
                int yValNeighbors = Convert.ToInt32(pts[j].YValues[0]);

                //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.XValue - pts[j].XValue), 2) + Math.Pow((yval - yValNeighbors), 2)) <= intTransPower)
                {
                    gr.Graphics.DrawLine(pen, p, pts[j);
                }
            }
        }
    }

    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["NoDG"].Points.Clear();
            chtGraph.Series["DG"].Points.Clear();
            buildGraph(intXAxis, intYAxis, intNumNodes, intNum_DG);
            drawEdges(intNumNodes, intTransPower);
        }
    }
}
4

3 に答える 3

1

DataPoint と Point は単純に同じ型ではありません。ただし、できることは、DataPoint フィールドを Point にコピーすることです。大まかな例:

Point point = new Point ();
DataPoint dataPoint = new DataPoint() ;
.....
point.X = dataPoint.X ;
point.Y = dataPoint.Y ;
于 2012-10-01T07:53:11.067 に答える
0

この拡張機能を作成して参照することができます。

namespace DrawingExtensions
{
    using System.Windows.Forms.DataVisualization.Charting;
    using System.Drawing;

    public static class Forms
    {
        public PointF ToPointF(this DataPoint source)
        {
            return new PointF(
                Convert.ToSingle(source.XValue),
                Convert.ToSingle(source.YValue));
        }

        public Point ToPoint(this DataPoint source)
        {
            return new Point(
                Convert.ToInt32(source.XValue),
                Convert.ToInt32(source.YValue));
        }
    }
}

明らかにこのように使用しますが、

var point = dataPoint.ToPoint();
var pointF = dataPoint.ToPointF();

または、一度に配列全体に対して、

var points = dataPoints.Select(p => p.ToPoint()).ToArray();
var pointFs = dataPoints.Select(p => p.ToPointF()).ToArray();
于 2012-10-01T08:14:12.367 に答える
0

間違っていたらすみませんが、DataPoint は Point をサブクラス化しません。System.Drawing.Point に自動的に変換することはできません。新しいポイントを作成しませんか?

//if the distance from the parent node (p) to the neighbor node is less than the transmit power, then draw 
if (Math.Sqrt(Math.Pow((p.XValue - pts[j].XValue), 2) + Math.Pow((yval - yValNeighbors), 2)) <= intTransPower)
{
    var point = new System.Drawing.Point((int)p.XValue, (int)p.YValue); 
    gr.Graphics.DrawLine(pen, point, pts[j);
}
于 2012-10-01T07:56:38.437 に答える