1

我有两个Lists 类型int,用于存储点坐标,称为Point_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
        {
        }
    }
}

xandy中,我得到了我点击的点的索引。如果我添加两个点并单击其中一个点,那么我将获得该点的两个索引,例如x将为 0 和y-1。

现在我正在浏览Point_X列表,我需要检查所有情况并将获得的索引与列表中的索引进行比较Point_XPoint_Y然后它应该删除我点击的点。

if似乎不起作用:if ((i == x) && (i == y) || y == -1 || x == -1). 如果我有两个点pictureBox1并且我单击第 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新类中的方法不会删除我单击的点,除非我单击它两次。


这是合乎逻辑的if ((i == x) && (i == y)),因为在某些情况下x是 1 和y0 所以变量 ( i) 永远不会也是 0 和 1 所以我被困在这里。

我不知道如何检查所有情况 - 例如x是 1 和y0。可能还有其他情况需要涵盖,但我认为问题出在此if声明的某个地方。


x = 1 , y = 1

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

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

我 = 0

当我有两个点并单击第二个点时就是这种情况。它没有在新类的函数中做任何事情,它没有删除这一点。

相同的第一点它没有删除它没有进入删除区域。这是当我使用 Alexei Levenkov 想法样本进行 If 检查时。

现在在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;
        }

例如,如果我有一个点并单击它,则 variable(t) = 0

然后列表 cyclicSelectedIndex 在 [0] 中有两个单元格/位置,我有 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,并且此列表中的每个索引都包含我要删除的 hte 点的坐标。

4

1 回答 1

4

您很可能希望将元素的值与 x/y 进行比较,而不是索引:

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

请注意,最好使用具有 X/Y 属性的类(如果您知道/有充分理由,则为结构)并将它们存储在一个列表中:

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