Хочу реализовать следующую идею: При нажатии кнопки пикчер бокс начинает следовать за курсором со скоростью, заданной таймером (допусим 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;
}
Для начала задайтесь вектором направления движения. Конечная точка минус начальная. Затем необходимо найти единичный вектор заданного направления и умножить на желаемую длину шага:
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);
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
C# / VS / Hosting - ошибка в работе с базой данных MS Sql
Привет! Суть вопроса имеется InputField для ввода текста и textField для отображения результатаПри вводе текста символы заменяются в определенном...
Допустим у меня есть метод, который принимает в качестве параметров 2 строки и возвращает одну строку
Добрый день, друзья! Встала предо мной задача реализация простенького распознавания текста с картинки (условие: чужеродные библиотеки для...