2

これは私が少しの間戦った問題であり、そこには良い答えが見つかりませんでした. 最終的にはRで解決しましたが、他の人が必要とする場合に備えて投稿すると思いました。誰かがよりエレガントなソリューションを持っている場合は、ぜひ見てみたいです。これはちょっと力ずくの努力です。

一連のペアの XY (デカルト) 座標があります。簡単な atan() コマンドを使用して、それらの間の角度を簡単に取得できます。ただし、コンパス (極?基軸?) 方向 (北 = 0°、東 = 90° など) の角度が必要です。これは、データとデカルト角度を作成するための最小限の例です。コンパス角度へのブルート フォース変換を以下に掲載しました。度数変換 (ラジアンから) は、'circular' パッケージの deg() を使用します。

require(circular)
test <- data.frame(x=c(0,1,1,1,0,-1,-1,-1),y=c(1,1,0,-1,-1,-1,0,1))
test$angle <- deg(atan(test$y/test$x))
test

...生産します

   x  y angle
1  0  1    90
2  1  1    45
3  1  0     0
4  1 -1   -45
5  0 -1   -90
6 -1 -1    45
7 -1  0     0
8 -1  1   -45

左下および左上の象限への角度は、右下および右上の象限への角度と同じであり、ベクトルの方向性が失われていることに注意してください。

4

4 に答える 4

3
ang <- function(x,y) { 
  z <- x + 1i * y
  res <- 90 - Arg(z) / pi * 180
  res %% 360
}

ang(test$x, test$y)
#[1]   0  45  90 135 180 225 270 315
于 2014-04-11T17:23:18.827 に答える
1

まず、y 軸 (または北 = 0) の測定角度をシフトするには、90 度を差し引いてコードの角度線を変更することで簡単に行うことができます (JK さんに感謝)。

test$angle <- 90-deg(atan(test$y/test$x))

ただし、左方向のベクトルの変換を維持する必要があるため、X 値と Y 値の符号に基づいてこれらの角度を調整することが私の解決策でした。

# Make new column for the polar/compass angles
test$polar <- test$angle
# Then make the necessary adjustments
# Adjustment for quadrant C (bottom left, 180 to 270°)
test[sign(test$x)==-1 & sign(test$y)==-1,"polar"] <- ((1-(test[sign(test$x)==-1 & sign(test$y)==-1,"angle"]/90))*90)+180
# Adjustment for quadrant D (top left, 270 to 360°)
test[sign(test$x)==-1 & sign(test$y)>=0, "polar"] <- abs(test[sign(test$x)==-1 & sign(test$y)>=0,"angle"])+180

...生産:

   x  y angle polar
1  0  1     0     0
2  1  1    45    45
3  1  0    90    90
4  1 -1   135   135
5  0 -1   180   180
6 -1 -1    45   225
7 -1  0    90   270
8 -1  1   135   315

繰り返しますが、これを実用的なソリューションとして投稿していますが、よりエレガントで簡単な提案もいただければ幸いです!

于 2014-04-11T16:34:58.750 に答える