2011-09-22 22 views
0

現在「M使用線性貝塞爾插值角度:逆時針插入一個角度?

float CardAnimation::valueAt(float valueA, float valueB, float t) const 
    { 
     return (1.0f - t) * valueA + t * valueB; 
    } 

.... 
if(m_startCard.m_angle != m_endCard.m_angle) 
      { 
       m_targetCard->m_angle = 
        valueAt(m_startCard.m_angle, m_endCard.m_angle,m_interval); 
      } 

可正常工作。但這是我的問題。如果你的起始角度是0.5f,而你想要達到6.0f(弧度),那麼當它從6.0f - 0.5f> 3.14f時,它會從0.5f順時針旋轉到6.0f,逆時針方向會更聰明從0.5f到6.0f(導致僅移動0.78弧度而不是5.5)。如果abs(endAngle - startAngle> PI),我應該怎樣做逆時針內插?

感謝

+0

這與以前的問題有什麼重大區別嗎?http://stackoverflow.com/q/6147839/2509和http://stackoverflow.com/q/6143964/2509? – dmckee

+0

是的,是的。 – jmasterx

+0

如果你真的相信那麼你的困難的根源是你還沒有正確地說明問題,因爲它們都是同一個任務的實例:*「識別兩個任意角度之間的弧」*。 – dmckee

回答

1

如果abs(endAngle - startAngle) > PI,然後從endAngle減去2*PI。然後,從0.56.0,而不是從0.5-0.28

編輯:

這實際上假定0 <= startAngle < endAngle <= 2*Pi

如果0 <= endAngle < startAngle <= 2*PistartAngle - endAngle > PI,然後添加2*PIendAngle

1

也許是這樣的:

  1. 規範化各個角度通過增加或減去反覆向2Pi躺在[0, 2Pi)

  2. 移動min(a, b)以便您的新端點是0c

  3. 您可能希望您的範圍爲c2Pi - c(以較小者爲準),您必須根據您在(2)處所做的操作來計算出符號。然後,您想要在原始起點和起點加上範圍之間進行插值。

+0

什麼是換班? – jmasterx

+0

Milo:翻譯。加。例如。 (a,b)變成(0,b-a)如果a更小。 –