Тема: AHK: Движение мыши по дуге
Как сделать так, что бы мышь прошла по кругу? Например, нарисовать окружность в пеинте с помощью AHK
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Как сделать так, что бы мышь прошла по кругу? Например, нарисовать окружность в пеинте с помощью AHK
Вспомнить курс школьной геометрии .
x^2 + y^2 = R^2 это я помню, но вот реализовать это в AHK не могу
Поковырялся на ночь глядя, сам не очень понял что получилось Может, пригодится. Следующий код должен начертить половину окружности (в Paint).
;начальные координаты и радиус
X0:=300
Y0:=300
R:=100
sleep, 3000
N:=X0-R
q:=ABS(N)
x:=N
y:=Y0
Loop, %q%
{
mousemove, %x%, %y%
x:= x+1
y:= Y0+sqrt(R**2-(X0-x)**2)
}
В вашем примере
при радиусе <100 получается полная полуокржность
при радиусе >=100 получается неполная полуокружность
почему?
Хотя вот в таком коде чертится полная окружность
!t::
;начальные координаты и радиус
X0:=300
Y0:=300
R:=100
sleep, 300
N:=X0-R
q:=ABS(N)
x:=N
y:=Y0
mousemove, %x%, %y%
MouseClick, left, , , , , D,
Loop, %q%
{
mousemove, %x%, %y%
x:= x+1
y:= Y0+sqrt(R**2-(X0-x)**2)
}
x:=N+q
Loop, %q%
{
x:= x-1
y:= Y0-sqrt(R**2-(X0-x)**2)
mousemove, %x%, %y%
}
MouseClick, left, , , , , U,
return
Вот так вроде работает правильно
SetBatchLines -1
SetMouseDelay 0
!t::
;начальные координаты и радиус
X0:=300
Y0:=330
R:=150
x1:=x:=X0-R
y1:=y:=Y0
x2:=X0+R
mousemove, %x%, %y%
sleep 20
MouseClick, left, , , , , D
sleep 100
Loop
{
mousemove, %x%, %y%
x:= x+1
y:= Y0+sqrt(R**2-(X0-x)**2)
If (x=x2) and (y=y1)
Break
}
sleep 100
x:=x2
Loop
{
x:= x-1
y:= Y0-sqrt(R**2-(X0-x)**2)
mousemove, %x%, %y%
If (x=x1) and (y=y1)
Break
}
MouseClick, left,,,,,U
ExitApp
Помогите изменить скрипт данный выше, чтобы курсор двигался вечно и с большей (изменяемой) скоростью. А также переключался с помощью F2:
f2::
works:=!works
Вот что получилось, но почему-то включение/выключение через F2 не работает и круг описывается курсором с разной скоростью. Нужно, чтобы курсор двигался равномерно и без пауз. Может кто знает, в чем дело?
SetBatchLines -1
SetMouseDelay 0
;начальные координаты и радиус
X0:=960
Y0:=540
R:=150
loop
{
if works
{
sleep 1000
continue
}
x1:=x:=X0-R
y1:=y:=Y0
x2:=X0+R
mousemove, %x%, %y%
sleep 20
sleep 100
Loop
{
mousemove, %x%, %y%
x:= x+1
y:= Y0+sqrt(R**2-(X0-x)**2)
sleep 5
If (x=x2) and (y=y1)
Break
}
x:=x2
Loop
{
x:= x-1
y:= Y0-sqrt(R**2-(X0-x)**2)
mousemove, %x%, %y%
sleep 5
If (x=x1) and (y=y1)
Break
}
}
return
f2::
works:=!works
return
f4::
ExitApp
PI := atan(1) * 4
works := 1
a := 0 ; угол поворота
da := 1 / R ; шаг изменения угла
Loop {
Sleep 20
if not works
continue
x := X0 + R * cos(a)
y := Y0 + R * sin(a)
MouseMove %x%, %y%
a -= da
if (a < 0)
a += 2 * PI
}
23.08.2016: забыл, что в AHK нет встроенной константы PI, — исправил оплошность.
wisgest,
Скрипт хороший, но курсор двигается рывками при установке большего угла, например, при R = 100 и da = 8 / R. Желательно, чтобы курсор перемещался плавно и с изменяемой клавишами скоростью, радиус можно оставить фиксированным (допустим, в 100 px).
Если под плавным движением подразумевается то, что последовательные положения указателя находятся в соседних пикселах, то при изменении угла с шагом da>1/R это в общем случае невозможно (т.к. полный оборот составляет 2PI радиан, а длина окружности — 2PI*R пикселов, то для перемещения на 1 пиксел требуется поворот на угол в 1/R радиан. Более того, это значение не помешало бы уменьшить вдвое, чтобы предусмотреть возможные погрешности округления машинной математики).
Скорость движения можно менять изменяя параметр Sleep. Если этой скорости не будет хватать, то придётся изменять положение «рывками» (с пропуском пикселей).
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться