forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Полезные функции (http://forum.boolean.name/forumdisplay.php?f=17)
-   -   2D - Angle, Nxz, Distance (http://forum.boolean.name/showthread.php?t=3184)

moka 19.04.2007 00:36

2D - Angle, Nxz, Distance
 
Низнаю, наверное уже были такие функции, просто я не нашёл их, и решил изобрести сам.
Для изобретения этих функций, хватает 9 классов образования (основное).


1. Расстояние:
Описание: Функция возвращает расстояние между двух точек.
Здесь я ничего не изобретал, а только основывался теореме Пифагора (Применима только для
прямоугольного треугольника) (g1*g1)+(g2*g2)=(b*b), где: g1 и g2 - катеты, а b - гипотенуза.
Сперва мне нужно узнать длину двух катетов, и затем по формуле вычислить длину Гипотенузы.

Код:

Function Distance2D#(x1#,y1#,x2#,y2#)
Local nx#=x1-x2 ;Длина горизонтального Катета
Local ny#=y1-y2 ;Длина Вертикального Катета
Return Sqr((nx*nx)+(ny*ny)) ;Длина Гипотенузы
End Function

x1 - X Координата Источника.
y1 - Y Координата Источника.
x2 - X Координата Цели.
y2 - Y Координата Цели.


2. Угол:
Описание: Функция возвращает угол от точек источника, к точкам цели.
Здесь пришлось пробовать различные математические функции, и реализация данной функции можно
делать двумя способами: с помощью ATan (АТангенс) + ещё написать небольшие условия; с помощью ATan2,
что есть тот же АТангенс, только имеет возможность вычислять всё сам, из двух координат.
После тестов, ATan2 выдал лучший результат производительности.

Код:

Function NVtoA#(sx#,sy#,tx#,ty#)
Return (180-ATan2((tx-sx),(ty-sy)))
End Function

sx - X Координата Источника.
sy - Y Координата Источника.
tx - X Координата Цели.
ty - Y Координата Цели.


3. Угол в Координаты:
Описание: Функции вычисляют координаты: x и y, относительно угла.
Здесь ничего сложного придумывать не пришлось, правда 90 градусов от угла отнять нужно, а почему - я не вникал.

Код:

Function AtoNX#(angle#)
Return -sin(angle)
End Function
Function AtoNY#(angle#)
Return cos(angle)
End Function

angle – Угол.


Вот пример для БлицМакса, с использованием данных функций.

Автор: МоКа

alcoSHoLiK 19.04.2007 00:59

Re: 2D - Angle, Nxz, Distance
 
cos(a - 90) = -sin(a)
sin(a - 90) = cos(a)

Уточни, пожалуйста: какие координаты относительно какого угла?

moka 19.04.2007 01:12

Re: 2D - Angle, Nxz, Distance
 
Не совсем понял вопроса, но насчёт:
Цитата:

cos(a - 90) = -sin(a)
sin(a - 90) = cos(a)
Спасибо!

AtoNX - Узнаём координату X из угла.
AtoNY - Узнаём координату Y из угла.

Угол будет вычислятся по стандарту из двух линий: вертикальная вверх, от точки угла, и указанная координата.
К примеру если угол 45 градусов, то AtoNX(угла)=0.707... ; AtoNY(угла)=-0.707...

alcoSHoLiK 19.04.2007 01:41

Re: 2D - Angle, Nxz, Distance
 
Ну это, имхо, просто вычисление синуса и косинуса угла. Функция оторвана от контекста.
Я так понял, это переход от сферических координат в прямоугольные. Тогда имеет смысл добавить значение "ро" в список входных параметров, чтобы не приходилось на него умножать в самом коде.

moka 19.04.2007 03:16

Re: 2D - Angle, Nxz, Distance
 
Ух, не считайте меня столь образованным, я конечно понял написанное, но подобно сообщение могу и не понять ;).
Это имхо, но дело уже каждого, кто будет использовать эти функции, и если ему нужно то он будет их изменять как ему угодно.
Цитата:

Ну это, имхо, просто вычисление синуса и косинуса угла. Функция оторвана от контекста.
Да, я и не пытался изобрести велосипед, и для многих порой тоже сперва подобные функции кажутся "далёкими", пока они не найдут раздел "Math" и не покопаются в нём получше. Я лишь выложил эти функции, не считая что я изобрёл колесо или "открыл омерику", просто мне нужно были эти функции, не имея доступа в интернет, я их сидел и пытался придумать, и у меня вышло,и я решил поделиться с другими, как у меня это вышло, счёл что они могут быть потребны и другим.
alcoSHoLiK - вижу что вы образованный человек. А я вот необразованный, не имею никаких оброзований, кроме минимального, поэтому для меня подобное может даётся и просто, но по началу время потребляет - что есть усилия, и результат.

:)

Platon 19.04.2007 08:51

Re: 2D - Angle, Nxz, Distance
 
Цитата:

Сообщение от MoKa
Код:

Function Distance2D#(x1#,y1#,x2#,y2#)
Local nx#=Abs(x1-x2) ;Длина горизонтального Катета
Local ny#=Abs(y1-y2) ;Длина Вертикального Катета
Return Sqr((nx*nx)+(ny*ny)) ;Длина Гипотенузы
End Function


Модуль здесь не нужен (Abs) ;)

Цитата:

Сообщение от MoKa
Код:

Function NVtoA#(sx#,sy#,tx#,ty#)
Return (360-(ATan2((tx-sx),(ty-sy))+180))
End Function


А здесь надо упростить :-)
Код:

Return 180 - ATan2((tx-sx),(ty-sy))

moka 01.05.2007 00:39

Re: 2D - Angle, Nxz, Distance
 
Сделал все поправки в первом посте, которые заметил Cyan. :)

alcoSHoLiK 01.05.2007 00:49

Re: 2D - Angle, Nxz, Distance
 
А мои поправки?)

moka 01.05.2007 00:52

Re: 2D - Angle, Nxz, Distance
 
Всё сделал, извеняюсь, просто что-топоспешил как-то :)


Часовой пояс GMT +4, время: 20:20.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot