[問題]將atan2(y,x)所得角度轉成0~2*PI |
尚未結案
|
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
ivanxyz
一般會員 ![]() ![]() 發表:7 回覆:10 積分:3 註冊:2004-03-03 發送簡訊給我 |
|
richtop
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
plihui 您好:
引言:大家都知道:atan2(y,x)求出來的值介於-PI和PI(-3.1459~3.1459)之間 我該如何將atan2(y,x)求出來的值設定為0~2*PI呢? 此外,當y=0,x=0時,atan2(y,x)會出現error 請問當y=0,x=0時該要如何處理?1) 當y=0,x=0時,大小為零,但無方向可言(或者說無法決定方向),所以要自行判斷或給定一個方向。 2) 第一三象限與第二四象限會出現值相同的狀況,也要分別討論: 因為atan(.)的取值結果是落在一四象限,所以可透過x的值來判定: 是否目前的座標點落在二三象限;如果是的話(x<0)就將得到的角度值加或減180度。 3) 如果要讓輸出的值在0到360之間,則可以依算出角度的值是: 正就直接輸出;負則加360再輸出。 底下的程式碼提供參考: float getAngle(float x, float y, bool deg360=false) { float theta, angle; if ( x==0.0 ) { if ( y>0.0 ) angle = 90; else if ( y<0.0 ) angle = -90; else angle = 0; } else { angle = atan(y/x)*180./3.141592653; if ( x<0.0 ) { if ( y>0.0 ) angle =180; else angle-=180; } } if ( deg360 && angle<0.0 ) angle =360; return (angle); }RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/07/21 22:16:05 發表人 - richtop 於 2004/07/21 22:17:37 |
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
[/quote] 1) 當y=0,x=0時,大小為零,但無方向可言(或者說無法決定方向),所以要自行判斷或給定一個方向。
2) 第一三象限與第二四象限會出現值相同的狀況,也要分別討論:
因為atan(.)的取值結果是落在一四象限,所以可透過x的值來判定:
是否目前的座標點落在二三象限;如果是的話(x<0)就將得到的角度值加或減180度。
3) 如果要讓輸出的值在0到360之間,則可以依算出角度的值是:
正就直接輸出;負則加360再輸出。 底下的程式碼提供參考:
float getAngle(float x, float y, bool deg360=false) { float theta, angle; if ( x==0.0 ) { if ( y>0.0 ) angle = 90; else if ( y<0.0 ) angle = -90; else angle = 0; } else { angle = atan(y/x)*180./3.141592653; if ( x<0.0 ) { if ( y>0.0 ) angle =180; else angle-=180; } } if ( deg360 && angle<0.0 ) angle =360; return (angle); }RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### [/quote] ps: 嗯嗯....其實我很少用atan(y/x)這個函數耶 如果用atan(y/x)的話,所得角度的值會在-PI/2~PI/2 之間,這下又開始頭痛了起來 |
plihui
初階會員 ![]() ![]() 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
[/quote] 1) 當y=0,x=0時,大小為零,但無方向可言(或者說無法決定方向),所以要自行判斷或給定一個方向。
2) 第一三象限與第二四象限會出現值相同的狀況,也要分別討論:
因為atan(.)的取值結果是落在一四象限,所以可透過x的值來判定:
是否目前的座標點落在二三象限;如果是的話(x<0)就將得到的角度值加或減180度。
3) 如果要讓輸出的值在0到360之間,則可以依算出角度的值是:
正就直接輸出;負則加360再輸出。 底下的程式碼提供參考:
float getAngle(float x, float y, bool deg360=false) { float theta, angle; if ( x==0.0 ) { if ( y>0.0 ) angle = 90; else if ( y<0.0 ) angle = -90; else angle = 0; } else { angle = atan(y/x)*180./3.141592653; if ( x<0.0 ) { if ( y>0.0 ) angle =180; else angle-=180; } } if ( deg360 && angle<0.0 ) angle =360; return (angle); }RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### [/quote] ps: 嗯嗯....其實我很少用atan(y/x)這個函數耶 如果用atan(y/x)的話,所得角度的值會在-PI/2~PI/2 之間,這下又開始頭痛了起來 |
richtop
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |