从极坐标变换角度

Posted

技术标签:

【中文标题】从极坐标变换角度【英文标题】:Transform angles from polar coordinates 【发布时间】:2018-03-21 19:27:05 【问题描述】:

我需要一些角度方面的帮助。

用包fossil和我们得到的函数fossil::earth.bear计算方位,根据帮助,

“地球上任意两点之间从真北顺时针方向的方位”。

我有一个使用此函数获得的角度向量,我需要对它们进行转换,使原点 (0º) 在 x 轴(东)上,角度逆时针递增。

基本上我需要一种方法将我的角度顺时针旋转 90º(因此 0º 将在 x 轴上“面向东方”),然后计算相反方向的角度(逆时针)。

直观地说,我尝试将 90º 添加到我的方位角(顺时针旋转),然后从 360 度减去它们(以计算“相反方向”的角度)。

但是,它不起作用,我高度怀疑每个象限都有不同的事情要做,但我就是想不通。

下面使用虚拟数据和极坐标直方图进行测试,以证明解决方案不起作用,因为结果向量 bearings2不等于起始向量 bearings

# Generate vector with 100 random values between 0 and 360
set.seed(123)
bearing <- runif(100, 0,360)
# generate a histogram with values binned every 5º
breaks = seq(0, 360, by=5)   
bearing.cut = cut(bearing, breaks, right=FALSE) 
bearing.freq = as.data.frame(table(bearing.cut))
bearing.freq$bearing.cut <- seq(5,360, by = 5)
#plot with ggplot
library(ggplot2)
ggplot(bearing.freq, aes(x = bearing.cut, y = Freq)) +
  coord_polar(theta = "x", start = 0 direction = 1) + #start 0 for north, direction 1 for cloclwise
  geom_bar(stat = "identity") +
  scale_x_continuous(breaks = seq(0, 360, 5))

这是它创建的情节 现在我在我的方位向量中执行上述操作

bearing2 <- 360-(bearing-90)
# repeat the process to generate freq table and plot 
breaks = seq(0, 360, by=5)    
bearing.cut2 = cut(bearing2, breaks, right=FALSE) 
bearing.freq2 = as.data.frame(table(bearing.cut2))
bearing.freq2$bearing.cut <- seq(5,360, by = 5)
#plot with ggplot
library(ggplot2)
ggplot(bearing.freq2, aes(x = bearing.cut2, y = Freq)) +
  coord_polar(theta = "x", start = -pi/2, direction = -1) + # now start at E and counterclockwise
  geom_bar(stat = "identity") +
  scale_x_continuous(breaks = seq(0, 360, 5))

这就是它产生的情节。显然,如果我的转换是正确的,那么这两个图应该看起来一样……但事实并非如此。

** 我已按照 Gregor 的建议进行了编辑(并设置了种子,使其可重复)。看起来更好,但我们失去了 0º 和 90º 之间的所有角度。这强化了我最初的想法,即每个象限都有不同的操作要做,但仍然无法弄清楚。不过,谢谢你的提示!

【问题讨论】:

尚未通读,但您说“我已尝试将 90º 添加到我的方位(顺时针旋转)”。通常添加角度是逆时针的旋转。试试360 - (bearing - 90) 【参考方案1】:

好的,我想我想通了,但不确定它为什么会起作用。我将把它留在这里以将问题标记为已回答。

解决方案是,对于第一个象限(0º 和 90º 之间的角度,我们需要计算 complementray angle 所以我们需要 90-bearing 。对于其余的象限,我们按照 Gregor 的建议(360-(bearing-90) )。

下面是一个可复现的例子的完整代码

library(ggplot2)
set.seed(123)

# 0º at North and clockwise
bearing <- runif(100, 0,360)

#create histogram
breaks = seq(0, 360, by=5)    # half-integer sequence 
bearing.cut = cut(bearing, breaks, right=FALSE) 
bearing.freq = as.data.frame(table(bearing.cut))
bearing.freq$bearing.cut <- seq(5,360, by = 5)

#plot
p1 <- ggplot(bearing.freq, aes(x = bearing.cut, y = Freq)) +
        coord_polar(theta = "x", start =0, direction = 1) +
        geom_bar(stat = "identity") +
        scale_x_continuous(breaks = seq(0, 360, 5))

# transform to 0º at E and counterclockwise
bearing2 <- ifelse(bearing <=90, (90-bearing), (360 - (bearing - 90)))

#create histogram
bearing.cut2 = cut(bearing2, breaks, right=FALSE) 
bearing.freq2 = as.data.frame(table(bearing.cut2))
bearing.freq2$bearing.cut <- seq(5,360, by = 5)

# plot
p2 <- ggplot(bearing.freq2, aes(x = bearing.cut, y = Freq)) +
        coord_polar(theta = "x", start = -pi/2, direction = -1) +
        geom_bar(stat = "identity") +
        scale_x_continuous(breaks = seq(0, 360, 5))

require(gridExtra)
grid.arrange(p1, p2, ncol=2)

【讨论】:

以上是关于从极坐标变换角度的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL入门(四)-- OpenGL坐标系与坐标变换

坐标变换

从基变换的角度理解旋转矩阵R

从基变换的角度理解旋转矩阵R

OpenGL里的坐标系统以及其变换

使用OpenCV透视变换技术实现坐标变换实践