2011-04-18 131 views
3

下面的代碼使用簡單的緩動功能將線條朝鼠標位置旋轉,但問題在於atan2()方法的工作形式-PI到PI,使得線條向後旋轉達到任何一個限制,我可以使它從0旋轉到TWO_PI,但沒有什麼不同,因爲線會向後旋轉直到它到達targetAngle,如果我不使用寬鬆計算可以正常工作,因爲從-PI跳轉到了PI是不明顯的,那麼我怎樣才能緩解我的旋轉並避免這個問題呢?輕鬆旋轉朝向鼠標

float angle = 0; 
float targetAngle = 0; 
float easing = 0.1; 

void setup() { 
    size(320, 240); 
} 

void draw() { 
    background(200); 
    noFill(); 
    stroke(0); 

    // get the angle from the center to the mouse position 
    angle = atan2(mouseY - height/2, mouseX - width/2); 
    // check and adjust angle to go from 0 to TWO_PI 
    if (angle < 0) angle = TWO_PI + angle; 

    // ease rotation 
    targetAngle += (angle - targetAngle) * easing; 

    pushMatrix(); 
    translate(width/2, height/2); 
    rotate(targetAngle); 
    line(0, 0, 60, 0); 
    popMatrix(); 
} 

感謝

回答

5

不知道如果我理解正確的問題......你的意思是,如果鼠標位置比+ PI略顯不足,而且targetAngle比-PI稍大,然後行旋轉離開鼠標?即使兩個值都在相同的範圍內(-PI,PI),它們仍然可能相距很遠。您必須調整angle以適合當前targetAngle值的PI鄰域。

// get the angle from the center to the mouse position 
angle = atan2(mouseY - height/2, mouseX - width/2); 
// check and adjust angle to be closer to targetAngle 
if (angle < targetAngle - PI) angle = angle + TWO_PI; 
if (angle > targetAngle + PI) angle = angle - TWO_PI; 

如果targetAngle是在(-TWO_PI,TWO_PI)的範圍這將工作。看來它會爲你工作。如果targetAngle可以有任何非常遠離工作範圍的值,那麼你可以使用類似這樣的東西:

// get the angle from the center to the mouse position 
angle = atan2(mouseY - height/2, mouseX - width/2); 
// calculate the shortest rotation direction 
float dir = (angle - targetAngle)/TWO_PI; 
dir = dir - Math.round(dir); 
dir = dir * TWO_PI; 

// ease rotation 
targetAngle += dir * easing;