c# следующий за курсором объект

214
14 ноября 2017, 22:08

Хочу реализовать следующую идею: При нажатии кнопки пикчер бокс начинает следовать за курсором со скоростью, заданной таймером (допусим timertick=50). Как это правильно реализовать? Я знаю, как получить текущие координаты курсора:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    point1 = new Point(e.X, e.Y);
}

Понимаю, как заставить пикчербокс двигаться:

private void timer3_Tick(object sender, EventArgs e)
{
    pictureBox5.Location = new Point(pictureBox5.Location.X + a, pictureBox5.Location.Y + b); // смещает координаты пикчербокса на a пикселей по оси X и на b по оси Y
}

Подскажите как реализовать движение за курсором, то есть каждый тик таймера пикчербокс должен двигаться в сторону текущего положения курсора. Код по ответу:

Point point1;
Point point2;
Point point3;
private void Form4_MouseMove(object sender, MouseEventArgs e)
{         
   point1 = new Point(e.X, e.Y);
}
private void timer4_Tick(object sender, EventArgs e)
{
   point2 = pictureBox5.Location;
   point3 = new Point(point1.X - point2.X, point1.Y - point2.Y);
   pictureBox5.Location = point3;
}
Answer 1

Для начала задайтесь вектором направления движения. Конечная точка минус начальная. Затем необходимо найти единичный вектор заданного направления и умножить на желаемую длину шага:

private void Timer1_Tick(object sender, EventArgs e)
{
    // Шаг
    int r = 5;
    // Вектор направления движения
    int x = point1.X - label1.Location.X;
    int y = point1.Y - label1.Location.Y;
    // Двигаться никуда не нужно, защита от деления на 0
    if (x == 0 && y == 0) return;
    // Длина вектора
    double k = Math.Sqrt(x * x + y * y);
    // Вектор заданного направления с желаемой длиной
    int dx = (int)(r * x / k);
    int dy = (int)(r * y / k);
    label1.Location = new Point(label1.Location.X + dx, label1.Location.Y + dy);
}

С использованием ValueTuple код можно написать еще более математически:

private void Timer1_Tick(object sender, EventArgs e)
{
    int r = 5;
    var (x, y) = (point1.X - label1.Location.X, point1.Y - label1.Location.Y);
    if (x == 0 && y == 0) return;
    double k = Math.Sqrt(x * x + y * y);
    var (dx, dy) = ((int, int))(r * x / k, r * y / k);
    label1.Location = new Point(label1.Location.X + dx, label1.Location.Y + dy);
}
READ ALSO
C# / VS / Hosting - ошибка в работе с базой данных MS Sql

C# / VS / Hosting - ошибка в работе с базой данных MS Sql

C# / VS / Hosting - ошибка в работе с базой данных MS Sql

259
Заменить символ и выделить (цветом и т.д)

Заменить символ и выделить (цветом и т.д)

Привет! Суть вопроса имеется InputField для ввода текста и textField для отображения результатаПри вводе текста символы заменяются в определенном...

258
Параллельный вызов метода C# WPF

Параллельный вызов метода C# WPF

Допустим у меня есть метод, который принимает в качестве параметров 2 строки и возвращает одну строку

311
Разбиением картинки на символы

Разбиением картинки на символы

Добрый день, друзья! Встала предо мной задача реализация простенького распознавания текста с картинки (условие: чужеродные библиотеки для...

267