線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4002
推到 Plurk!
推到 Facebook!

[問題]將atan2(y,x)所得角度轉成0~2*PI

尚未結案
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-21 20:46:29 IP:218.168.xxx.xxx 未訂閱
求助各位大大: 大家都知道: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時該要如何處理?
ivanxyz
一般會員


發表:7
回覆:10
積分:3
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-21 21:48:02 IP:61.229.xxx.xxx 未訂閱
plihui你好: 你的第一個問題: double d = atan2(y,x)+ M_PI;    第二個問題: 先判斷x,y等於0就不要做atan2不是就好了?
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-21 22:13:49 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-22 14:35:37 IP:140.126.xxx.xxx 未訂閱
[/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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-22 14:35:59 IP:140.126.xxx.xxx 未訂閱
[/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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-22 15:04:45 IP:140.129.xxx.xxx 未訂閱
plihui 您好: 因為沒有用過atan2(.),所以把問題弄複雜了。 經過測試atan2(.)之後,其實您的問題不難解決: 當atan2(.)的傳回值小於零,將該結果加上360即可。 當atan2(.)的傳回值大於零,將該結果直接輸出。 至於x=0,y=0的情況,再判斷一下就好。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
系統時間:2024-07-04 8:03:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!