1

下の画像のように、有向グラフをグラフィカルに表現する必要があります。

代替テキスト http://img694.imageshack.us/img694/1605/graf.gif

私は C# フォームを持っています。マウスでクリックすると、ノードを描画する必要があります。まだノードが描画されていないフォームのどこかをクリックすると、ノードを描画するつもりでクリックしたことを意味します。ノードがそこにある場合は、それを選択して記憶する必要があります。次のマウスクリックで、まだノードが描画されていない場所に触れると、以前と同じように、新しいノードを描画したいことを意味します。クリックしたノードである場合、最初に記憶されたノードから線を描画する必要があります選択したものに追加し、道路費用の詳細を追加します。

フォームをクリックしたときにグラフのノードを表す円を描く方法を知っています。私は次のコードを使用しています:

namespace RepGraficaAUnuiGraf
{
    public partial class Form1 : Form
    {
        Graphics graphDrawingArea;
        Bitmap bmpDrawingArea;
        Graphics graph;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            bmpDrawingArea = new Bitmap(Width, Height);
            graphDrawingArea = Graphics.FromImage(bmpDrawingArea);
            graph = Graphics.FromHwnd(this.Handle);
        }

        private void Form1_Click(object sender, EventArgs e)
        {          
            DrawCentralCircle(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y, 15);
            graph.DrawImage(bmpDrawingArea, 0, 0);
        }

        void DrawCentralCircle(int CenterX, int CenterY, int Radius)
        {
            int start = CenterX - Radius;
            int end = CenterY - Radius;
            int diam = Radius * 2;
            bmpDrawingArea = new Bitmap(Width, Height);
            graphDrawingArea = Graphics.FromImage(bmpDrawingArea);
            graphDrawingArea.DrawEllipse(new Pen(Color.Blue), start, end, diam, diam);
            graphDrawingArea.DrawString("1", new Font("Tahoma", 13), Brushes.Black, new PointF(CenterX - 8, CenterY - 10));
        }

    }
}

私の質問は、フォームの座標 (x,y) でノードを描画したかどうか、またそれがどれであるかを確認するにはどうすればよいですか? ノードをボタンとして表現し、タグまたはノード番号に似たものを付けることを考えました(図面では、サンタバーバラの場合は 1、バーストウの場合は 2 などにする必要があります)。

4

5 に答える 5

4

Anders Abel からの回答を拡張します。

  • 以下を含む各ノードに関する情報を格納するリストを保持します
  • 中心点
  • 半径
  • その他の関連情報 ...

クリックすると、ノードの 1 つがヒットしたかどうかを判断します

  • すべてのノードを反復処理する
  • ピタゴラスの定理を使用して、クリック ポイントからノードの中心までの距離を見つける
  • 距離が半径より小さい場合は、ノードを選択します
  • ノードが選択されていない場合は、クリックした場所に新しいノードを追加します
于 2010-03-07T21:41:11.147 に答える
4

1 つの方法は、円を表す (および描画する) UserControl を作成し、ユーザーがクリックしたときにも処理することです。次に、X 座標と Y 座標を使用してユーザーがクリックした場所と円をクリックしたかどうかを判断するのではなく、各円オブジェクトにクリックされたかどうかを判断させることができます。

于 2010-03-07T21:34:35.590 に答える
2

WindowsUIの基本的な意図されたパターンが欠落しているのではないかと思います。上記のコードを破棄して、これを実行します。

  1. 「ドキュメント」(グラフ、そのノード、およびエッジについて追跡する必要があるすべてのもの)を表すデータ構造をメモリ内に作成します。

  2. マウスクリックでは、描画しません。「ドキュメント」のデータ構造を変更するだけです(上記のように)。さらに、Invalidate()を呼び出すと、後で再描画されます。

  3. OnPaint()をオーバーライドします。ここですべての描画を行い、保存したデータ構造の視覚的表現を描画します。

于 2010-03-08T06:12:17.780 に答える
1

ノードのリストを作成し、ノードの中心からクリックされたポイントまでの距離が半径未満であるかどうかを確認することもできます。

private void Form1_MouseClick(object sender, MouseEventArgs e)
{    
       int x1 = node.Center.X, y1 = node.Center.Y, x2, y2;
       Point local = this.PointToClient(Cursor.Position);
       bool clicked = false;
       x2 = local.X;
       y2 = local.Y;
       float distance = Convert.ToSingle(Math.Sqrt((x1 - x2) ^ 2 + (y1 - y2) ^ 2));
       if(distance <= radius) clicked = true;
}
于 2011-10-02T21:30:47.283 に答える