forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Повороты (http://forum.boolean.name/showthread.php?t=1253)

SubZer0 06.08.2006 18:37

Повороты
 
Блин... есть тут функция... на выдумку уходит минут 15, и поскольку она в себе ничего серьезного не несет, после того как выдумана и закодена - сразу забывается... но когда снова приходится такое писать опять получается стопр минут на 10-15... вот думаю где бы ее записать, так чтобы ее потом можно было в любое время посмотреть... и надумал напостить тут! (да и новичкам в программировании поможет)

Описание:

Функция поворота объекта на нужный угол по минимальному пути поворота...
Поподробнее... Допустим у нас есть танк, повернут на угол в 248 градусов (система 0-360)... теперь в программе нам надо его повернуть на угол в 54 градуса в какую сторону нам его поворачивать?

итак сама функция:

[highlight=java]if (Tank.Angle != Tank.TargetAngle) {
int T=Tank.Angle-Tank.TargetAngle;
if (T>0) {
if (T>8) {Tank.Angle=Tank.Angle+Tank.AngleSpeed;
} else {Tank.Angle=Tank.Angle-Tank.AngleSpeed;}
} else {
if (T>-8) {Tank.Angle=Tank.Angle+Tank.AngleSpeed;
} else {Tank.Angle=Tank.Angle-Tank.AngleSpeed;}
}
}[/highlight]

Написано для ЯвыМикроЭдишн... без участия математических функций... с юзанием аналога функции SGN() все это удобнее получается

Перевод на человеческий:

вычитаем целевой угол от текущего... если получается разница больше чем в 180 градусов, то этот путь длинный... а если разница получается отрицательная то чисто-наоборот...

;)

impersonalis 06.08.2006 19:14

Re: Повороты
 
Как это можно сделать на B3D (если, конечно, не юзать готовую фунЕцию AlignToVector entity,vector_x#,vector_y#,vector_z#,axis[,rate#] или PointEntity entity,target[,roll#] ) в одну формулу (благодаря SGN)
[highlight=blitzbasic]
current_angle#=100
target_angle#=120
angle_speed#=1

;================
current_angle#=current_angle+Sgn(target_angle-current_angle)*angle_speed#
;================

DebugLog current_angle#
[/highlight]
Можно, кончено SGN и самому реализовать ( различными способами) но в случае Sub-а важна скорость выполнения - IF-ы рулят

SubZer0 06.08.2006 19:19

Re: Повороты
 
угу! так оно и было...

гут что есть два варианта... начинающим теперь будет легче разобраться... :)

impersonalis 06.08.2006 19:32

Re: Повороты
 
Для С++ целесообразно также юзать оператор
Код:

+=


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

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