Изменение всех предметов в списке очков - PullRequest
0 голосов
/ 05 июня 2011
    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 && 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, а затем форма Paint рисует их по одной.

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

IУ меня нет идей, буду благодарен за любые подсказки.

1 Ответ

1 голос
/ 05 июня 2011

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

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))
...