Jump to content

Нужна формула расчета разности углов.


Recommended Posts

Всем, доброго времени суток.

Допустим, начальный угол поворота объекта равен 300. Мне нужно его повернуть по кратчайшему пути так, чтобы его угол стал 5(Верная разность между ними 65(кратчайший путь), а не 295, как вы подумали). Как вы видите, простое вычитание из большего меньшее тут не пройдет. Я говорю про самый последний аргумент функции moveObject, поворот по оси Z. Известно, ели давать отрицательные значения, то объект поворачивается направо,- положительные влево.

Link to comment

вероятно ему надо рассчитать поворот турели на цель по кратчайшей траектории, либо направо, если 90 градусов, либо налево, если те же 90 градусов, а не 270. а вообще сравни углы до цели по модулю и вращай в нужную сторону. (дада, я такой умный, но в скриптах воще ноль ЖВ)

Link to comment

итак, вот он правильный вариант, если углы всегда положительные и не более 360 (:

-- находим кратчайший угол поворота 
diffZ = endZ - startZ 
  
-- если нужно, подправим его слегка 
if diffZ > 180 then 
    diffZ = diffZ - 360 
elseif diffZ < -180 then 
    diffZ = diffZ + 360 
end 

если углы могут быть любым числом то

-- сделаем углы положительными и не более 360 градусов. 
if startZ < 0 then 
    startZ = startZ - math.ceil(startZ / 360) * 360 
elseif startZ > 360 then 
    startZ = startZ -          (startZ % 360) * 360 
end 
  
if endZ < 0 then 
    endZ = endZ - math.ceil(endZ / 360) * 360 
elseif endZ > 360 then 
    endZ = endZ -          (endZ % 360) * 360 
end 
  
  
-- находим кратчайший угол поворота 
diffZ = endZ - startZ 
  
-- если нужно, подправим его слегка 
if diffZ > 180 then 
    diffZ = diffZ - 360 
elseif diffZ < -180 then 
    diffZ = diffZ + 360 
end 

а вот тестовый скрип целиком, его проверить можно здесь - http://www.lua.org/demo.html

-- начальный и конечный углы 
math.randomseed( os.time() ) 
startZ = math.random(0,360) 
endZ =   math.random(0,360) 
  
  
-- сделаем углы положительными и не более 360 градусов. 
if startZ < 0 then 
    startZ = startZ - math.ceil(startZ / 360) * 360 
elseif startZ > 360 then 
    startZ = startZ -          (startZ % 360) * 360 
end 
  
if endZ < 0 then 
    endZ = endZ - math.ceil(endZ / 360) * 360 
elseif endZ > 360 then 
    endZ = endZ -          (endZ % 360) * 360 
end 
  
  
-- находим кратчайший угол поворота 
diffZ = endZ - startZ 
 [b][/b] 
-- если нужно, подправим его слегка 
if diffZ > 180 then 
    diffZ = diffZ - 360 
elseif diffZ < -180 then 
    diffZ = diffZ + 360 
end 
  
print( 'startZ = '..startZ..', endZ = '..endZ ) 
print( 'diffZ = '..diffZ ) 

startZ - начальный угол

endZ - конечный

diffZ - разница

чтобы повернуть нужно startZ + diffZ

Link to comment

Последний скрипт работает на все сто, всем спасибо за помощь, особая благодарность Easterdie, за разъяснение сути вопроса, и MX_Master за готовый скрипт.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...