と と呼ばれるポイント座標を格納するList
タイプのが 2 つあります。int
Point_X
Point_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 つのインデックスが取得されます。たとえば、x
0 とy
-1 になります。
今、私はPoint_X
リストを実行しています。すべての状況を確認し、取得しているインデックスをリスト内のインデックスと比較する必要がありますPoint_X
。Point_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 と、このリストの各インデックスには、削除したい点の座標が含まれています。