Что нового

Как реализовать рандомные клики в пределах окружности

SerisS

Новичок
Сообщения
1
Репутация
0
Есть круг, известно его расположение на экране, то есть, можно оценить радиус и примерно найти центр. Например, центр находится в точке x:1000 и y:500, а радиус равен 30. Как сделать так, чтобы в программе совершался клик в одной из точек этого круга?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
SerisS,
Код:
Global Const $iDegToRad = 4 * ATan(1) / 180
Global $iX = @DesktopWidth / 2, $iY = @DesktopHeight / 2, $iR = @DesktopHeight / 2 - 50, $iTimeMove = 60000 ;1 min

_MouseToCircle()
Sleep(1000)
_MouseToCenter()
Sleep(1000)
_MouseRandomMoveInCircle()

Func _MouseToCenter()
	MouseMove($iX, $iY, 5)
EndFunc   ;==>_MouseToCenter

Func _MouseToCircle()
	For $i = 0 To 360
		MouseMove($iX + $iR * Cos($i * $iDegToRad), $iY + $iR * Sin($i * $iDegToRad), 0)
		Sleep(5)
	Next
EndFunc   ;==>_MouseToCircle

Func _MouseRandomMoveInCircle()
	Local $i_Time = TimerInit()
	While TimerDiff($i_Time) < $iTimeMove
;~ 		MouseMove($iX + Random(0, $iR, 1) * Cos(Random(0, 360, 1) * $iDegToRad), $iY + Random(0, $iR, 1) * Sin(Random(0, 360, 1) * $iDegToRad), 0)
		MouseMove($iX + Random(-$iR, $iR, 1), $iY + Random(-$iR, $iR, 1), 0)
		Sleep(Random(500, 1000, 1))
	WEnd
EndFunc   ;==>_MouseRandomMoveInCircle
Корректный пример см. в посте C2H5OH ниже.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
OffTopic:
А я бы в школу отправил. Уроки учить.



Добавлено:
Сообщение автоматически объединено:

madmasles,
по моему, Вы выходите за пределы окружности в _MouseRandomMoveInCircle()

Я немного подправил :-[
Код:
Global Const $iDegToRad = 4 * ATan(1) / 180
Global $iX = @DesktopWidth / 2, $iY = @DesktopHeight / 2, $iR = @DesktopHeight / 2 - 50, $iTimeMove = 60000 ;1 min

_MouseToCircle()
Sleep(1000)
_MouseToCenter()
Sleep(1000)
_MouseRandomMoveInCircle()

Func _MouseToCenter()
    MouseMove($iX, $iY, 5)
EndFunc   ;==>_MouseToCenter

Func _MouseToCircle()
    For $i = 0 To 360
        _MouseMovePolar($iR, $i)
        Sleep(5)
    Next
EndFunc   ;==>_MouseToCircle

Func _MouseRandomMoveInCircle()
    Local $i_Time = TimerInit()
	Local $tR, $tL
    While TimerDiff($i_Time) < $iTimeMove
		$tR = Random(0, $iR, 1)
		$tL = Random(0, 359, 1)
        _MouseMovePolar($tR, $tL)
        Sleep(Random(500, 1000, 1))
    WEnd
EndFunc   ;==>_MouseRandomMoveInCircle

Func _MouseMovePolar($mR, $mL)
    MouseMove($iX + $mR * Cos($mL * $iDegToRad), $iY + $mR * Sin($mL * $iDegToRad), 0)
EndFunc   ;==>_MouseMovePolar
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Вот здесь (это ж квадрат, вроде)
Код:
MouseMove($iX + Random(-$iR, $iR, 1), $iY + Random(-$iR, $iR, 1), 0)


Да и здесь нестыковка, потому что берётся Cos и Sin не от того же самого угла, а от двух разных случайных.
Код:
MouseMove($iX + Random(0, $iR, 1) * Cos(Random(0, 360, 1) * $iDegToRad), $iY + Random(0, $iR, 1) * Sin(Random(0, 360, 1) * $iDegToRad), 0)



Добавлено:
Сообщение автоматически объединено:

В Вашем примере

Я не претендую, это Ваш пример, я лишь математику подправил.

мышь будет перемещаться в пределах полукруга.

Нет, весь круг. Достаточно запустить чтобы убедиться.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH,
OffTopic в этом посте ко мне тоже относится. :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Код:
AdlibRegister('_Stop', 4000)
$Log = ''
$R = @DesktopHeight / 2
$R1 = $R
$v = 0
$n = 3.14159265358979 / 180
While 1
	$v += 3
	$x = Round($R * Cos($v * $n) + $R1)
	$y = Round($R * Sin($v * $n) + $R1)
	$R -= 1
	If $v = 360 Then $v = 0
	; $Log &= $x & ' - ' & $y & @CRLF
	MouseMove($x, $y, 0)
	Sleep(10)
WEnd

Func _Stop()
	; MsgBox(0, 'Message', $Log)
	Exit
EndFunc   ;==>_Stop
 
Верх