2014-04-11 4 views
0

이것은 조금 싸워서 거기서 좋은 대답을 찾을 수없는 문제입니다. 나는 R에서 그것을 결국 해결했지만, 다른 사람들이 그것을 필요로 할 경우를 대비하여 어쨌든 그것을 게시 할 것이라고 생각했습니다. 누구든지 좀 더 우아한 해결책을 가지고 있다면, 나는 그것을보고 싶다. 이것은 약간의 무차별적인 노력입니다.직교 각을 R의 극좌표/나침반/추기경으로 변환 하시겠습니까?

일련의 XY (직교 좌표) 좌표가 있습니다. 간단한 atan() 명령을 사용하여 그들 사이의 각도를 쉽게 얻을 수 있습니다. 그러나 북극 = 0 °, 동쪽 = 90 ° 등 나침반 (극지? 추기경) 방향의 각을 원합니다. 다음은 데이터와 데카르트 각도를 만드는 데 필요한 최소한의 예입니다. 아래에 나침반 각도로 브 루트 포스 변환을 게시했습니다. 각도 변환 (라디안에서)은 '원형'패키지에서 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 

주 생산 벡터의.

+0

'atan2 (x, y)'뒤에 있습니까? – baptiste

+0

atan2()를 시도했지만 왼쪽 사분면에 음의 각도를 반환하므로 극좌표로의 변환이 여전히 필요합니다. –

답변

1
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 
+0

Roland에게 감사드립니다. 이것은 완벽하게 작동하는 것 같습니다. 복잡한 숫자 표기법에 익숙하지 않아 조금 해체해야 할 것입니다. –

+1

글쎄,'z'는 분명해야하고'Arg'는 극형의 각도를 제공합니다. – Roland

1

먼저, Y 축 측정하는 각도 시프트 (또는 노스 = 0) 90 개도 (감사 JK) 빼서 코드의 각 라인을 변경함으로써 용이하게 수행 할 수

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

을 제조 ...

# 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 값의 부호에 기초하여이 각도에 대한 조정은 내 용액이었다

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 

다시 말씀 드리지만,이 해결책을 게시하는 중이지만 더 우아하고 쉬운 제안도 환영 할 것입니다.