Страница 1 из 1

Как двигать мышь по окружности?

Добавлено: 13 сен 2009, 16:39
Dr_Grizzly
Добрый день! Пишу вспомогательную прогу, которая заменить человеческую руку на программную. Появилась трабла, не могу заставить двигаться мышь по окружности с заданным радиусом, 8-и угольник получается, а окружность не выходит... Пользуюсь функцией:

mouse_event(MOUSEEVENTF_MOVE, x,y, 0, 0);

где x,y координаты смещения курсора от текущей позиции.

Понимаю что нужен таймер на форме... А вот что написать в обработчике таймера, не соображу, возможно даже два таймера понадобится, но не уверен...

Формула окружности 2*pi*R
http://ru.wikipedia.org/wiki/%D0%9E%D0% ... 1%82%D1%8C вот некая инфа по окружностям...
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Данна процедура рисует окружность с начальными координатами xc,yc и радиусом r

procedure DrawCircle(xc : Integer; yc : Integer; r : Integer);
var
x : Integer;
y : Integer;
d : Integer;
begin
x := 0;
y := r;
d := 3-2*r;
while y>=x do
begin
form1.Image1.Canvas.Pixels[x+xc,y+yc]:=clred;
{SetPixel(x+xc, y+yc);}
form1.Image1.Canvas.Pixels[x+xc, -y+yc]:=clred;
form1.Image1.Canvas.Pixels[-x+xc, y+yc]:=clred;
form1.Image1.Canvas.Pixels[-x+xc, -y+yc]:=clred;
form1.Image1.Canvas.Pixels[y+xc, x+yc]:=clred;
form1.Image1.Canvas.Pixels[y+xc, -x+yc]:=clred;
form1.Image1.Canvas.Pixels[-y+xc, x+yc]:=clred;
form1.Image1.Canvas.Pixels[-y+xc, -x+yc]:=clred;
if d<0 then
begin
d := d+4*x+6;
end
else
begin
d := d+4*(x-y)+10;
y := y-1;
end;
x := x+1;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DrawCircle(20,20,30);
end;

Re: Как двигать мышь по окружности?

Добавлено: 14 сен 2009, 16:57
Игорь Акопян
тут рисуется окружность точками от каждой из четырёх осей.
тебе нужна другая формула - параметрическое уравнение окружности
[syntax='Delphi']
procedure DrawCircle(xc : Integer; yc : Integer; r : Integer);
var
x, ox: Integer;
y, oy : Integer;
rx, ry, I: extended;
d : Integer;
begin
x := 0;; y := 0; I := 0;
rx := 0;
ry := 0;
d := 3-2*r;

mouse_event(MOUSEEVENTF_MOVE+MOUSEEVENTF_ABSOLUTE, 100, 100, 0, 0); // тут 100-100 лень было вычислять координаты для попадания в окружность
while I<2*pi do
begin
ox := x; oy := y;
rx := xc + R * Cos(I);
ry := yc + R * Sin(I);
x := round(rx);
y := round(ry);
Image1.Canvas.Pixels[x,y]:=clred;
mouse_event(MOUSEEVENTF_MOVE, x-ox, y-oy, 0, 0);
Application.ProcessMessages;
sleep(10);

I := I+0.1;
end;
end;
[/syntax]

Re: Как двигать мышь по окружности?

Добавлено: 22 сен 2009, 09:26
Dr_Grizzly
благодарю! Тож ништяк ;)
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Интересная штука получается, я малость модернизировал код и попробовал посмотреть как он рисует в Paint'е карандашем... r- не совсем радиус )))

procedure DrawCircle(xc : Integer; yc : Integer; r : Integer);
var x, ox: Integer; y, oy : Integer; rx, ry, I: extended; d : Integer;
begin
x := 0;
y := 0;
I := 0;
rx := 0;
ry := 0;
d := 3-2*r;
while I<2*pi do
begin
ox := x;
oy := y;
rx := R * Cos(I);
ry := R * Sin(I);
x := round(rx);
y := round(ry);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0,0, 0, 0);
mouse_event(MOUSEEVENTF_MOVE, x-ox, y-oy, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0,0, 0, 0);
Application.ProcessMessages;
sleep(5);
I := I+0.1;
end;
end;

Крутил, вертел код, не могу сообразить как заставить его правильную окружность начертить ))) Она не идеальная получается.. Хотя в Imape рисует вполне красивую окружность )) Попробуй создай таймер на форме, повесь на него

Timer1.Enabled:=false;
drawcircle(strToInt(edit1.Text),strToInt(edit2.Text),strToInt(edit3.Text));

А время на таймере поставь 2000, чтобы было время переключится в Paint и погляди как нарисует окружность ))))
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
А для чего мы расчитываем переменную d ??? она вроде тут нигде не учавствует )))