8

実行したいシミュレーションを容易にするために必要なデカルト座標 (緯度、経度) を極座標に変換するソリューションを探していましたが、これを行うための質問や回答が見つかりませんでしたR. Matlab の組み込み関数 cart2pol を含む多くのオプションがありますが、私のデータはすべて R にあり、このフレームワークで快適に作業を続けたいと考えています。

質問:

タグ付けデータからの緯度/経度座標があり、これらを極座標 (つまり、ジャンプのサイズと角度: http://en.wikipedia.org/wiki/Polar_coordinate_system ) に変換して、それらをシャッフルまたはブートストラップできるようにしたい (どちらにするかは決めていません)約1,000回、シミュレートされた各トラックの開始点からの直線距離を計算します。私は実際のトラックを持っています。この動物がサイト アフィニティを示しているかどうかを判断することに興味があります。ジャンプ サイズと回転角度は同じですが、順序と組み合わせがまったく異なる 1,000 個のランダムなトラックをシミュレートします。したがって、距離の分布を作成し、これを実際のデータ セットの直線距離と比較するには、原点から 1,000 の直線距離が必要です。

私はブートストラップを快適に行うことができますが、デカルトの緯度/経度座標を極座標 (ジャンプ サイズと回転角度) に変換する最初のステップで立ち往生しています。Matlab などの他のプログラムでこれを行うための関数が組み込まれていることは知っていますが、R でそれを行う方法が見つかりません。for ループで手動で行うこともできますが、パッケージが出ている場合そこに、またはそれを行う簡単な方法があれば、私はそれを望んでいます。

理想的には、データを極座標に変換してシミュレーションを実行し、各ランダム トラックの終点をデカルト座標 (緯度/経度) として出力して、移動した直線距離を計算できるようにしたいと考えています。

緯度と経度の座標の 2 列のデータ フレームになるだけなので、サンプル データは投稿しませんでした。

ご協力いただきありがとうございます。このサイトや私が見逃した他のサイトのどこかに簡単な説明がある場合は、その方向を教えてください! 何も見つかりませんでした。

乾杯

4

7 に答える 7

7

同じ単位 (緯度と経度ではなくメートル) の xy 座標の場合、この関数を使用して、ジャンプ サイズと回転角度 (度単位) の data.frame を取得できます。

getSteps <- function(x,y) {
    d <- diff(complex(real = x, imaginary = y))
    data.frame(size = Mod(d), 
               angle = c(NA, diff(Arg(d)) %% (2*pi)) * 360/(2*pi))
}

## Try it out   
set.seed(1)
x <- rnorm(10)
y <- rnorm(10)
getSteps(x, y)
#        size     angle
# 1 1.3838360        NA
# 2 1.4356900 278.93771
# 3 2.9066189 101.98625
# 4 3.5714584 144.00231
# 5 1.6404354 114.73369
# 6 1.3082132 135.76778
# 7 0.9922699  74.09479
# 8 0.2036045 141.67541
# 9 0.9100189 337.43632

## A plot helps check that this works
plot(x, y, type = "n", asp = 1)
text(x, y, labels = 1:10)

ここに画像の説明を入力

于 2013-05-03T04:52:44.873 に答える
2

かなり簡単なので、独自の関数を作成できます。cart2polRの Matlab のような関数:

cart2pol <- function(x, y)
{
  r <- sqrt(x^2 + y^2)
  t <- atan(y/x)

  c(r,t)
}
于 2013-05-03T04:31:29.027 に答える
1

私が書いたこのコードは極座標に変換すると思います:

# example data
x<-runif(30)
y<-runif(30)
# center example around 0
x<-x-mean(x)
y<-y-mean(y)

# function to convert to polar coordinates
topolar<-function(x,y){

    # calculate angles 
    alphas<-atan(y/x)

    # correct angles per quadrant
    quad2<-which(x<0&y>0)
    quad3<-which(x<0&y<0)
    quad4<-which(x>0&y<0)
    alphas[quad2]<-alphas[quad2]+pi
    alphas[quad3]<-alphas[quad3]+pi
    alphas[quad4]<-alphas[quad4]+2*pi

    # calculate distances to 0,0
    r<-sqrt(x^2+y^2)

    # create output
    polar<-data.frame(alphas=alphas,r=r)

}

# call function
polar_out<-topolar(x,y)
# get out angles
the_angles<-polar_out$alphas
于 2019-05-29T09:32:26.027 に答える
1

この方法でカテジアンと極性の間で変換を行うことができると思います:

polar2cart <- function(r, theta) {
  data.frame(x = r * cos(theta), y = r * sin(theta))
}

cart2polar <- function(x, y) {
  data.frame(r = sqrt(x^2 + y^2), theta = atan2(y, x))
}
于 2020-12-24T12:49:20.417 に答える
0

程度のみの別のオプション

pol2car = function(angle, dist){
    co = dist*sin(angle)
    ca = dist*cos(angle)
    return(list(x=ca, y=co))
}
pol2car(angle = 45, dist = sqrt(2))
于 2016-08-18T22:29:06.383 に答える