1

Тема: AHK: Движение мыши по дуге

Как сделать так, что бы мышь прошла по кругу? Например, нарисовать окружность в пеинте с помощью AHK

2

Re: AHK: Движение мыши по дуге

Вспомнить курс школьной геометрии .

3

Re: AHK: Движение мыши по дуге

x^2 + y^2 = R^2 это я помню, но вот реализовать это в AHK не могу

4

Re: 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)
}

5 (изменено: InFlames, 2009-06-12 11:44:56)

Re: AHK: Движение мыши по дуге

В вашем примере
при радиусе <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

6

Re: AHK: Движение мыши по дуге

Вот так вроде работает правильно

   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

7 (изменено: Gector, 2016-08-22 18:43:10)

Re: AHK: Движение мыши по дуге

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


f2::
works:=!works

8

Re: AHK: Движение мыши по дуге

Вот что получилось, но почему-то включение/выключение через 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

9 (изменено: wisgest, 2016-08-23 20:54:21)

Re: AHK: Движение мыши по дуге

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, — исправил оплошность.

10

Re: AHK: Движение мыши по дуге

wisgest,
Скрипт хороший, но курсор двигается рывками при установке большего угла, например, при R = 100 и da = 8 / R. Желательно, чтобы курсор перемещался плавно и с изменяемой клавишами скоростью, радиус можно оставить фиксированным (допустим, в 100 px).

11 (изменено: wisgest, 2016-08-23 03:16:19)

Re: AHK: Движение мыши по дуге

Если под плавным движением подразумевается то, что последовательные положения указателя находятся в соседних пикселах, то при изменении угла с шагом da>1/R это в общем случае невозможно (т.к. полный оборот составляет 2PI радиан, а длина окружности — 2PI*R пикселов, то для перемещения на 1 пиксел требуется поворот на угол в 1/R радиан. Более того, это значение не помешало бы уменьшить вдвое, чтобы предусмотреть возможные погрешности округления машинной математики).

Скорость движения можно менять изменяя параметр Sleep. Если этой скорости не будет хватать, то придётся изменять положение «рывками» (с пропуском пикселей).