C # Гладкое движение объекта
-
26-09-2019 - |
Вопрос
У меня есть весь необходимый код для перемещения и щелкнуть мышь через код C #, но я не хочу просто установить положение мыши в X
а также Y
; Это будет выглядеть jerky. Вместо этого я хочу иметь плавный переход от точки X1, Y1
В точку X2, Y2
более Z секунд. Похоже на ключевые фрахты.
Я ищу метод, похожий на это:
public void TransitionMouse(int x, int y, double durationInSecs)
Это просто плавно перемещает мышь из своей текущей позиции в x
а также y
в durationInSecs
секунды. У меня вызывается функция:
public void MoveMouse(int x, int y)
Который перемещает мышь на x
, y
немедленно.
РЕДАКТИРОВАТЬ
Спасибо за помощь, ребята! Вот законченный и проверенный код:
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
public void TransitionMouseTo(double x, double y, double durationSecs)
{
double frames = durationSecs*100;
PointF vector = new PointF();
PointF mousePos = Cursor.Position;
vector.X = (float)((x - mousePos.X) / frames);
vector.Y = (float)((y - mousePos.Y) / frames);
for (int i = 0; i < frames; i++)
{
SetCursorPos((int)(mousePos.X += vector.X), (int)(mousePos.Y += vector.Y));
Thread.Sleep((int)((durationSecs / frames) * 1000.0));
}
}
Решение
Вы могли бы сделать это несколькими способами. Одним из вариантов будет рассчитывать вектор, необходимый для перемещения мыши каждый кадр и нанесите его в течение периода времени к положению мыши.
Итак, если мы находимся в положении 5,5 и хочем перейти к 20,30 более 10 кадрам, наш вектор будет следующим:
val = (цель - начало) / кадры;
x = (20 - 5) / 10; y = (30 - 5) / 10;
Вектор = 1,5,2,5
Затем в вашем методе TransitionMouse вы нанесите вектор в положение мыши медленно в течение любой длительности, используя метод Thread.sleep для управления скоростью. Код может выглядеть так:
public void TransitionMouseTo(int x, int y, int durationSecs)
{
int frames = 10;
PointF vector = new PointF();
vector.X = (x - Cursor.Position.X) / frames;
vector.Y = (y - Cursor.Position.Y) / frames;
for (int i = 0; i < frames; i++)
{
Point pos = Cursor.Position;
pos.X += vector.X;
pos.Y += vector.Y;
Cursor.Position = pos;
Thread.Sleep((durationSecs / frames) * 1000);
}
}
Еще один способ сделать это было бы использовать Алгоритм Брезенхэма Для расчета всех точек курсор мыши переместится, а затем продвигается через каждую точку и снова наносит его к курсору, используя резьбу.
Стив
Другие советы
Действительно зависит от вашего определения гладкого, однако, впрочем, большинство алгоритмов «гладкого» движения используют сплайн для интерполяции между 2 или более точками данных.
Это может помочьhttp://geekswithblogs.net/juandoneblo/archive/2007/10/25/data-interpolation-with-spline-in-csharp.aspx.