1

と と呼ばれるポイント座標を格納するListタイプのが 2 つあります。intPoint_XPoint_Y

これは、新しいクラスの削除メソッドです。

public void DeletePoint(int x, int y)
{
    for (int i = 0; i < Point_X.Count; i++)
    {
        if ((i == x) && (i == y) || y == -1 || x == -1) 
        {
            Point_X.RemoveAt(i);
            Point_Y.RemoveAt(i); 
        }
        else
        {
        }
    }
}

xとで、yクリックしたポイントのインデックスを取得しています。2 つのポイントを追加してそのうちの 1 つをクリックすると、ポイントの 2 つのインデックスが取得されます。たとえば、x0 とy-1 になります。

今、私はPoint_Xリストを実行しています。すべての状況を確認し、取得しているインデックスをリスト内のインデックスと比較する必要がありますPoint_XPoint_Yその後、クリックしたポイントを削除する必要があります。

これifは機能していないようです: if ((i == x) && (i == y) || y == -1 || x == -1). 2 つのポイントがpictureBox1あり、ポイント番号 2 をクリックして削除しようとすると、最初は削除されません。ただし、2回目にクリックすると削除されます。

Form1これは、ポイントを削除するためにクリックするボタン クリックのコードです。

private void button3_Click(object sender, EventArgs e)
{           
    wireObject1.DeletePoint(cyclicSelectedIndex[0],cyclicSelectedIndex[1]);
    button3.Enabled = false;
}

pictureBox1これは、のMouseDownイベントで選択したいポイントをクリックするコードです。

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        label1.Visible = true;
        label4.Visible = true;

        // find the index that is closest to the current mouse location
        float t = wireObject1.GetIndexByXY(e.X, e.Y, 5);

        if (t == -1)
        {
            button3.Enabled = false;
        }
        else
        {
            button3.Enabled = true;
            {
                selectedIndex = t;
                mouseMove = true;
                OriginalX = wireObject1._point_X[(int)selectedIndex];
                OriginalY = wireObject1._point_Y[(int)selectedIndex];

                if (cyclicSelectedIndex.Count() == 2)
                {
                    cyclicSelectedIndex[currentCyclicIndex] = (int)selectedIndex;
                    currentCyclicIndex++;
                    if (currentCyclicIndex == 2)
                    {
                        currentCyclicIndex = 0;
                    }

                    if ((cyclicSelectedIndex[0] == cyclicSelectedIndex[1]) || (cyclicSelectedIndex[0] == -1) || (cyclicSelectedIndex[1] == -1))
                    {
                        button2.Enabled = false;
                    }
                    else
                    {
                        button2.Enabled = true;
                    }

                    for (int i = 0; i < wireObject1._connectionstart.Count; i++) 
                    {
                        if ((wireObject1._connectionstart[i] == cyclicSelectedIndex[0] && wireObject1._connectionend[i] == cyclicSelectedIndex[1]) ||
                                   (wireObject1._connectionstart[i] == cyclicSelectedIndex[1] && wireObject1._connectionend[i] == cyclicSelectedIndex[0]))
                        {
                             button2.Enabled = false;
                        }
                    }

                    label13.Text = selectedIndex.ToString();
                    label13.Visible = true;
                    label14.Visible = true;

                    listView1.Items.Add(selectedIndex.ToString()).EnsureVisible();
                }
            }
        }
    }
}

問題はDeletePoint、新しいクラスのメソッドが、クリックしたポイントを 2 回クリックしない限り削除しないことです。


if ((i == x) && (i == y))場合によってxは 1 でyあり 0 であるため、変数 ( i) が 0 にも 1 にもならないため、これは論理的であるため、ここで立ち往生しています。

すべての状況を確認する方法はわかりません。たとえばx、1 と0 です。カバーするシナリオは他にもあるかもしれませんが、問題はこのステートメントyのどこかにあると思います。if


x = 1 、y = 1

Point_X >>> [0] = 331.0、[1] = 212.0

Point_Y >>> [0] = 213.0 、[1] = 212.0

私は= 0

これは、2 つの点があり、2 番目の点をクリックした場合です。ポイントを削除しなかった新しいクラスの関数では何もしませんでした。

それが削除されなかった最初のポイントと同じで、削除領域に入りませんでした。これは、If チェックに Alexei Levenkov のアイデア サンプルを使用する場合です。

Form1でpictureBox1のポイントをクリックすると、マウスダウンイベントで新しいクラスのポイントのインデックスを計算する変数(t)があります。

public float GetIndexByXY( int x , int y , float tol)
        {
            for (idx = 0; idx < Point_X.Count; ++idx)
            {
                float dx = Point_X[idx] - x;
                float dy = Point_Y[idx] - y;
                float dist = (float)Math.Sqrt(dx * dx + dy * dy);

                if (dist < tol) return idx;

            }
            return -1;
        }

たとえば、1 つのポイントがあり、それをクリックすると、変数(t) = 0 になります。

次に、List cyclicSelectedIndex には [0] に 2 つのセル/場所があり、[1] には 0 があり、[1] には -1 があり、currentCyclicIndex は現在 1 で、selectedIndex は 0 で、マウス ダウン イベントの Form1 にあります。マウスダウンイベントは、削除したいポイントをマークするためのものです。

Form1ボタンで、ポイントを削除するためにクリックした場所をクリックします:

private void button3_Click(object sender, EventArgs e)
        {



            wireObject1.DeletePoint(cyclicSelectedIndex[0],cyclicSelectedIndex[1]);
            button3.Enabled = false;

            pictureBox1.Invalidate();
        } 

cyclicSelectedIndex[0] = 0 および cyclicSelectedIndex[1] = -1

そのため、DeletePoint 関数の新しいクラスでは次のようになります。

public void DeletePoint(int x, int y)
        {

            for (int i = 0; i < Point_X.Count; i++)
            {

                if ((Point_X[i] == x) && (Point_Y[i] == y) || y == -1 || x == -1) 
                {
                    Point_X.RemoveAt(i);
                    Point_Y.RemoveAt(i); 
                }
                else
                {
                }
            }



        }

x = 0 および y = -1

ここで、リストからインデックス 0 と -1 を削除する必要があります: Point_x と Point_Y と、このリストの各インデックスには、削除したい点の座標が含まれています。

4

1 に答える 1

4

ほとんどの場合、要素の値をインデックスではなく x/y と比較します。

if ((Point_X[i] == x) && (Point_Y[i] == y) || y == -1 || x == -1)  

X/Y プロパティでクラス (わかっている場合や正当な理由がある場合は構造体) を使用し、それらを 1 つのリストに格納することをお勧めします。

class MyPoint { public int X;public int Y;}
List<MyPoint> point = new List<MyPoint>();
于 2012-06-23T23:06:08.777 に答える