Изменение всех элементов в списке точек

#c# #list #point

#c# #Список #точка

Вопрос:

     List<Point> pointList;        
    public int pickedIndexRight = -1;
    public int diffX = 0;
    public int diffY = 0;
    public Form1()
    {
        InitializeComponent();

        pointList = new List<Point>();
    }
    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        Point myPoint = new Point(e.X, e.Y);
        if (e.Button == MouseButtons.Left)
        {
            if (pickedIndex == -1)
            {
                if (pointList.Contains(myPoint) == false)
                {
                    pointList.Add(myPoint);
                }
            }
        }
        else if (e.Button == MouseButtons.Right)
        {
        //if right click near a point then pickedIndexRight is index of that point in list
        pickedIndexRight = pointList.FindIndex(delegate(Point point) { return Distance(point, myPoint) < 10; });
        }
        Invalidate();
    }
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {

        if (e.Button == MouseButtons.Right amp;amp; pickedIndexRight != -1)
        {
            for (int i = 0; i < pointList.Count - 1; i  )//(int i = pointList.Count - 1; i > 0; i--)
            {
                diffX = pointList[i].X   (e.X - pointList[i].X);
                diffY = pointList[i].Y   (e.Y - pointList[i].Y);
                pointList[i] = new Point(diffX, diffY);
                Invalidate();
            }

        }
    }
    private void Form1_MouseUp(object sender, MouseEventArgs e)
    {
        pickedIndexRight = -1;
        Invalidate();
    }
    private double Distance(Point p1, Point p2) //calculate distance between two points
    {
        double d = Math.Sqrt((p2.X - p1.X) * (p2.X - p1.X)   (p2.Y - p1.Y) * (p2.Y - p1.Y));
        return d;
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
            foreach (Point myPoint in pointList)
            {
                e.Graphics.DrawRectangle(Pens.Black, myPoint.X, myPoint.Y, 1, 1);
            }
    }
  

Хорошо, итак, мне нужно, чтобы мое приложение рисовало точки на форме при каждом щелчке левой кнопкой мыши — это работает просто отлично. Все точки сохраняются в списке pointList, а затем форма рисования рисует их каждую по одной.

Дело в том, что мне нужно, чтобы у программы была другая функциональность — параллельное перемещение всех точек путем перетаскивания одной из точек правой кнопкой мыши — я уже написал функцию для этого, но я не могу понять, почему мой код не работает должным образом — кажется, он портит весь список, когда я щелкаю правой кнопкой мыши.

У меня закончились идеи, я был бы благодарен за любые подсказки.

Комментарии:

1. Почему -1 в i < pointList.Count - 1 ? Не должна ли последняя точка тоже переместиться?

Ответ №1:

В этой строке:

 diffX = pointList[i].X   (e.X - pointList[i].X);
  

pointList[i].X Условия отменяются. Так что это просто:

 diffX = e.X;
  

Вы присваиваете текущее положение мыши каждой точке. Если вы хотите переместить все точки на расстояние, на которое переместилась мышь, но сохранить их положения относительно друг друга, вам нужно запомнить предыдущее положение мыши, чтобы вы могли сравнить его с новым положением. Разница между новым и старым положением мыши — это правильное количество, которое нужно добавить к каждой точке.

Итак, добавьте поле, такое как:

 Point oldMousePosition;
  

И инициализируйте его при нажатии кнопки. В каждом событии перемещения:

 pointList[i] = new Point(pointList[i].X   (e.X - oldMousePosition.X),
                         pointList[i].Y   (e.Y - oldMousePosition.Y))
  

Комментарии:

1. Упс, оставил крестик во второй строке.