PDA

Просмотр полной версии : Прыгучее вращение стрелки компаса


BMF
13.06.2002, 14:59
Господа, помогите пожалуйста разобраться.
Есть компас, вокруг него расположены шесть шариков.Наводишься мышкой на шарик и стрелка компаса тут же прыгает в направлении этого шарика.
Скрипт сидит в прототипе, он простой и работает, но почему-то даёт сбой.
Вот скрипт:

rotacia = -180*Math.atan2(_x-x, _y-y)/Math.PI;

// определяется направление на цель( тот самый шарик, координаты которого занесены в переменные x и y )
speed = 0.6;
_rotation += (rotacia - _rotation)/speed

//Код,который и делает то самое прыгучее движение к заданной цели

Всё просто и всё по идее должно работать.Но работает только частично.То есть шарики находящиеся на отметках 0,60,120,300 градусов работают, а 270 и 180 - нет! Особенно 180.То есть где-то вкрадывается некая ошибка а где - никак не пойму.

Кто сможет обьяснить в чём проблема?

AZart.de
13.06.2002, 15:39
smotritsia ofigitelno :D
a esli prosto po kolhoznomu kajdoi knopke action napisat' tipa
_root.funkciya(60)
gde 60 - eto srazu gradus?
vsiako proshe bylo by.


a voobshe eto grabli s 4etvertiamy
tam u tebia gde-to math.abs() nehvataet.

i ishe, esli peretianut' ves' kompas v drugoi ugol, to perestaiut drugie 2 knopki pahat'.

peredavai parametr gradusom, ili radianom srazu, i ne par' sebe mozgi.
ili eto nau4naia rabota kakaya? :D

BMF
13.06.2002, 16:02
Да какая там научная работа! :) Просто хотелось бы как-то элегантно решить поставленную задачку.Чтобы легко было изменить в случае чего.
Я заметил что проблема наверняка с дробями, и что где-то что-то куда-то не туда влазит.Причём если изменять значение переменной speed, то стрелка начинает вообще дурить по страшному.
Можно например скрипт изменить на такой:

rotacia = -180*Math.atan2(_x-x, _y-y)/Math.PI;
_rotation<rotacia ? accellerator++ : accellerator--;
accellerator *= 0.9;
_rotation += accellerator;

В таком случае всё работает, кроме самого нижнего шарика, который 180 градусов.На 180 стрелка начинает крутиться на месте...

AZart.de
13.06.2002, 16:07
nu a s radianamy/gradusamy ne elegantno?

BMF
13.06.2002, 16:20
Пробовал.
Но, то ли я не очень понимаю с чем эти градусы с радианами едят, то ли ещё что, но суть в том что если задать стрелке _rotation сразу в градусах, то до 180 она ещё доходит а потом начинается полная ерунда, то есть стрелка начинает по каким то законам складывать-вычитать углы и её вращение становится совершенно непредсказуемым.
Эх,надо было учить тригонометрию в своё время.. :(

sanitar
13.06.2002, 16:24
тригонометрия мать её....:)
Замени 180 на 179.9 :)
Тригономерия хитрая вещь, но мы и её перехитрим;)

AZart.de
13.06.2002, 16:26
otpravlay ee na ukazannyi gradus, a potom po utihaushei baltai vozle zadannogo zna4aniya...
doljno vrode bez problem pahat'...

ia etu trigonometriyu s ee formulami privedeniya sam nenavidel
odnu formulu toka naizust' znal, vrode sinus dvoinogo ugla... ili cosinus... hren ego znaet :-)
poishi v seti u4ebnik po algebre dlia 4ainikov :D

kstati strelka doljna _obiazatelno_ po krat4aishemu puti idti, u kompasa tak...

DMN
13.06.2002, 16:28
Вроде так:


MovieClip.prototype.dot = function ()
{
rotacia = -180*Math.atan2(_x-x, _y-y)/Math.PI;
if ((rotacia-_rotation)>180) rotacia=_rotation-360+(rotacia-_rotation);
if ((rotacia-_rotation)<-180) rotacia=_rotation+360+(rotacia-_rotation);
speed = 0.6;
_rotation += (rotacia - _rotation)/speed
};

BMF
13.06.2002, 16:47
2DMN:
Спасибо, мил человек! :)
Спас.Я нутром где-то чувствовал что надо проверять угол "на вшивость" но всё никак не мог понять как:)
Спасибо.Всё работает.