2012-08-22 81 views
0

下面是從笛卡爾轉換爲Polar co-ords的代碼。 else if語句(y> 0)= pi/2 else -pi/2 ... 這兩行的相關性是什麼?當然,你只需要theta = atan(y/x)和r = sqrt(x^2 + y^2)來確定正確的theta和r? 當我進入調試,並把檢查點看到的代碼是如何運行的,看來這部分也從未使用...混淆爲什麼這部分代碼是必需的?

可有人請闡明這些線路的相關一些輕?

謝謝。

這裏是應用程序的代碼;

void cartesianToPolar (float x, float y, double *rPtr, double *thetaPtr) 
{ 
    //store radius in supplied address - calc for r 
    *rPtr = sqrt(x * x + y * y); 

    //calc theta 
    float theta; 
    if (x == 0.0) { 
     if (y== 0.0) { 
      theta = 0.0; 
     } else if (y > 0){ 
     theta = M_PI_2; 
    } else { 
     theta = -M_PI_2; 
    } 
    }else{ 
     theta = atan(y/x); 
    } 
     //store theta in address 
     *thetaPtr = theta; 
    } 
int main (int argc, const char * argv[]) 
{ 
    double pi = 3.14; 
    double integerPart; 
    double fractionPart; 

    // Pass add of integerPart as argument 
    fractionPart = modf(pi, &integerPart); 
    // Find value stored in intpart 
    printf("integerPart = %.0f, fractionPart = %.2f\n", integerPart, fractionPart); 

    double x = 3.0; 
    double y = -4.0; 
    double radius; 
    double angle; 

    cartesianToPolar(x,y,&angle,&radius); 
    printf("(%.2f, %.2f) becomes (%.2f radiants, %.2f)\n", x, y, radius, angle); 

    return 0; 
} 
+1

請考慮更改您的標籤。其中沒有太多的objective-c,但是標準c,你可能想用「極座標」來標記它。 –

+0

對不起,你說的c與objective-c相反是正確的。 –

回答

0

如果x等於0的聲明

theta = atan(y/x); 

將由零exeption thow一個部門。

1

這個測試,當x == 0(在這種情況下,你不能做y/x)時調用,決定點是向上還是向下(所以角度是PI/2或-PI/2)。

也許你對壞縮進感到困惑。它應該是:

if (x == 0.0) { 
    if (y == 0.0) { 
     theta = 0.0; 
    } else if (y > 0){ 
     theta = M_PI_2; 
    } else { 
     theta = -M_PI_2; 
    } 
} 
+0

對,我想這是真的。所以這實際上是說...如果x == 0跳到else if(y> 0)以防止代碼吐出'undefined,因爲除以0的任何東西趨於無窮大。 –

+0

什麼困惑我是我認爲這是在theta == 0.0照顧(因爲這也是爲了防止趨於無限) –

+0

是的。當x == 0時,不能使用atan方式,但解決方案只是三種可能值中的一種(第一種,theta = 0,有點特別,因爲這主要是一種約定)。 –