Иногда приходится в программах двигать мышку по кругу. Или вычислять угол наклона прямой, проходящей через две точки.
Данный скрипт демонстрирует такие возможности.
Перед запуском скрипта на экране должен быть:
1) развернут графический редактор Paint (можно другой)
2) в левой верхней части экрана - открыт чистый лист для рисования (или на весь экран)
3) выбран инструмент карандаш (или кисть)
Для работы скрипта подходят только последние версии пилота (2.24.1 уже подходит).
Самую последнюю версию UOPilot всегда можно скачать
здесь.
Скрипт работы с углами и с окружностью
Код
// Скрипт демонстрирует работу с окружностью. (c) Zeleax
// Перед запуском скрипта на экране должен быть развернут Paint, в левой верхней части экрана - открыт чистый лист,
// выбран инструмент карандаш
set linedelay 0 // устанавливаем задержку между строк в 0 мс
// ***** Секция инициализации расчётов - в начале скрипта *****
set #crl_tan_step 3 // углы от 0 до 90 градусов с шагом 3
// список тангенсов углов * 1000
set $tans 0 52 105 158 213 268 325 384 445 510 577 649 727 810 900 1000 1111 1235 1376 1540 1732 1963 2246 2605 3078 3732 4705 6314 9514 19081 99999
set clipboard $tans
get clipboard %crl_tans
// список синусов углов * 1000
set $sins 0 52 105 156 208 259 309 358 407 454 500 545 588 629 669 707 743 777 809 839 866 891 914 934 951 966 978 988 995 999 1000
set clipboard $sins
get clipboard %crl_sins
// ***** Исходные данные *****
set #Xc 300 // центр окружности
set #Yc 300
set #crl_radius 100 // радиус окружности
// *********** Вариант 1 - определяем значение угла вектора между точками (#Xc, #Yc) и (#X, #Y)
set #X 397// для угла 15 градусов
set #Y 326
// подготовка к расчету
set #crl_dx #X - #Xc
set #crl_dy #Y - #Yc
// определеяем угол для значений #crl_dx, #crl_dy
gosub getAlfa
msg Тест: Угол равен #crl_alfa градусов (должен быть 15 градусов)
// *********** Вариант 2 - рисуем окружность в Paint'e
set #X #Xc + #crl_radius // координаты точки окружности для угла = 0
set #Y #Yc
kleft_down #X #Y abs // зажали левую кнопку мыши
wait 300
for #i 0 360 // можно было бы задать шаг 3 или больше- для ускорения прочерчивания
set #crl_alfa #i
gosub GetDXDY // получаем значения #crl_dx, #crl_dy
set #X #Xc + ( #crl_dx )
set #Y #Yc - ( #crl_dy )
move #X #Y abs // двигаем мышку в новую точку
end_for
kleft_up #X #Y abs // отпустили левую кнопку мыши
msg Окружность построена
end_script
// процедура возвращает смещения #crl_DX и #crl_DY относительно центра окружности для заданного в градусах
// значения угла #crl_alfa и радиуса #crl_radius
:GetDXDY
// приводим #crl_alfa к диапазону 0..360 градусов
set #crl_alfa #crl_alfa - ( #crl_alfa / 360 * 360 )
if #crl_alfa < 0
set #crl_alfa #crl_alfa + 360
end_if
set #crl_alfa2 #crl_alfa
if #crl_alfa >= 90 and #crl_alfa <= 180
set #crl_alfa2 180 - #crl_alfa
else
if #crl_alfa >= 180 and #crl_alfa <= 270
set #crl_alfa2 #crl_alfa - 180
else
if #crl_alfa >= 270 and #crl_alfa <= 360
set #crl_alfa2 360 - #crl_alfa
end_if
end_if
end_if
set #crl_i (#crl_alfa2 + 1) / #crl_tan_step + 1
set #crl_tan %crl_tans[1 #crl_i] // получили тангенс угла * 1000
set #crl_sin %crl_sins[1 #crl_i] // получили синус угла * 1000
set #crl_dy #crl_radius * #crl_sin / 1000
set #crl_dx #crl_radius * #crl_sin / #crl_tan
if #crl_dx = 0 and #crl_dy = 0
if ( #crl_alfa < 10 ) or ( #crl_alfa > 350 )
set #crl_dx #crl_radius
set #crl_dy 0
else
set #crl_dx (-1) * #crl_radius
set #crl_dy 0
end_if
return
end_if
if #crl_alfa >= 90 and #crl_alfa <= 180
set #crl_alfa 180 - #crl_alfa
set #crl_dx #crl_dx * (-1)
else
if #crl_alfa >= 180 and #crl_alfa <= 270
set #crl_alfa #crl_alfa - 180
set #crl_dx #crl_dx * (-1)
set #crl_dy #crl_dy * (-1)
else
if #crl_alfa >= 270 and #crl_alfa <= 360
set #crl_alfa 360 - #crl_alfa
set #crl_dy #crl_dy * (-1)
end_if
end_if
end_if
return
// процедура возвращает значение угла #crl_alfa в градусах по заданным #crl_DX и #crl_DY
:getAlfa
if #crl_dx = 0
if #crl_dy >= 0
set #crl_alfa 90
else
set #crl_alfa 270
end_if
return
end_if
// определяем тангенс угла
set #crl_tan #crl_dy * 1000 / #crl_dx
if #crl_tan < 0
set #crl_tan #crl_tan * (-1)
end_if
// Ищем ближайшее значение угла по его тангенсу
set #crl_tan_size size(%crl_tans[1]) - 1
set #crl_dmin 9999999
set #crl_alfa 0
for #crl_i 1 #crl_tan_size
set #crl_d %crl_tans[1 #crl_i] - #crl_tan
if #crl_d < 0
set #crl_d #crl_d * (-1)
end_if
if #crl_d < #crl_dmin
set #crl_dmin #crl_d
else
set #crl_alfa (#crl_i - 2) * #crl_tan_step // угол
break
end_if
end_for
if (#crl_dx <= 0) and (#crl_dy >= 0)
set #crl_alfa 180 - #crl_alfa
else
if (#crl_dx <= 0) and (#crl_dy <= 0)
set #crl_alfa 180 + #crl_alfa
else
if (#crl_dx >= 0) and (#crl_dy <= 0)
set #crl_alfa 360 - #crl_alfa
end_if
end_if
end_if
// теперь в #crl_alfa хранится значение ближайшего угла
return