Member 11620192 Ответов: 1

C# стирание графики с помощью списка


У меня есть функция, которая не всегда работает. Когда левая кнопка мыши нажата и удерживается, и вы перетаскиваете изображение, оно удаляет точки, хранящиеся в 2D-списке, и перерисовывает другие графики. Он отлично работает при установке его на событие MouseUp m, но при вызове в событии MouseMove он будет работать, если я свирепо наведу курсор мыши на изображение, которое в конечном итоге удалит его. Может быть, это проблема с недостаточно быстрым циклом??



private void Canvas_Panel_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {

        if (iamPainting)
        {
            Pen p = new Pen(Color.Black, float.Parse("2"));
            g.DrawLine(p, new Point(initX ?? e.X, initY ?? e.Y), new Point(e.X, e.Y));
            Lines2[theSize].Add(new Point(initX ?? e.X, initY ?? e.Y));
            Lines2[theSize].Add(new Point(e.X, e.Y));
        }
        else if (isErase)
        {
            Console.WriteLine("Erase: " + e.X.ToString() + " " + e.Y.ToString());
            int indexToRemove = 0;
            Boolean timetoBreak = false;
            for (int i = 0; i < Lines2.Count; i++)
            {
                for (int i2 = Lines2[i].Count - 1; i2 > 0; i2--)
                {
                    if (e.X == Lines2[i][i2].X && e.Y == Lines2[i][i2].Y)
                    //if (e.X >= Lines2[i][i2].X - 2 && (e.X + 2) <= Lines2[i][i2].X + 2 && e.Y >= Lines2[i][i2].Y - 2 && (e.Y + 2) <= Lines2[i][i2].Y + 2)
                    {
                        indexToRemove = i;
                        timetoBreak = true;
                        break;
                    }
                    if (timetoBreak)
                        break;
                }
            }
            if (timetoBreak)
            {
                Lines2.RemoveAt(indexToRemove);
                theSize -= 1;
                Canvas_Panel.Refresh();
            }
        }
        initX = e.X;
        initY = e.Y;
    }
}


Что я уже пробовал:

Я пробовал разные циклы, используя разные события, но на самом деле ничего не работает.

1 Ответов

Рейтинг:
0

Sven Bardos

Я бы сказал, Да, слишком много всего происходит в MouseMove. Сколько точек вы сохранили в своем массиве линий? 10? 100? > 1000?
Если у вас много точек, возможно, вам нужно какое-то более умное решение, которое позволяет избежать повторения каждой точки (например, кластеризации в сетку).
И, возможно, Вам не нужно пробовать каждую точку в MouseMove. Пробуйте только те точки, которые превышают заданное расстояние до предыдущей точки.
Затем вы можете поиграть с расстоянием, чтобы увидеть, сколько образцов может обработать ваш код.

Надеюсь, это поможет,
Свен