Здравствуйте, гость ( Вход | Регистрация )

> Черчение Окружности, готовый скрипт
Zeleax
сообщение 9.12.2011, 16:07
Сообщение #1


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Иногда приходится в программах двигать мышку по кругу. Или вычислять угол наклона прямой, проходящей через две точки.

Данный скрипт демонстрирует такие возможности.

Перед запуском скрипта на экране должен быть:
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


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 5.7.2025, 17:13
Designed by Nickostyle