点与向量之间的相对角度

Posted

技术标签:

【中文标题】点与向量之间的相对角度【英文标题】:Relative angle between point and vector 【发布时间】:2018-03-28 13:33:17 【问题描述】:

我需要计算点数组和向量数组之间的角度(调整向量的方向)。我正在使用this 中的angle2 函数(基于atan2)来计算角度,但是我似乎做错了什么。

数据是 2 个连续轨道。一个轨道带有一个课程值,另一个是简单的坐标。所以一个轨道(Easting2,Northing2)是一个向量数组,另一个(Easting,Northing) - 只是点。我想我必须将这些点制作成相对于另一个基于矢量的轨道的矢量,然后使用 atan2 方法。这是我的思考过程:

    使用 track2 (Easting2, Northing2) 调整 track1 (Easting, Northing; 即 轨道 2 成为轨道 1 的起点) 如果 track2 采取长度为 1 的步长,则计算一组坐标 与给定 track2 路线相同的方向(这是 next.easting 和 next.northing) 计算重新定位的轨道 1 和轨道之间的角度 track2 的假想点。

但是,在此处的示例中,我预计第一行的角度约为 30 度,第二行的角度约为 50 度。我做错了什么??

玩具示例:

library(dplyr)
df <- structure(list(Easting = c(519984.801109577, 520254.016648783
), Northing = c(8015778.00697284, 8017130.41190275), Easting2 = c(520033.416692364, 
518599.418722116), Northing2 = c(8029164.59837475, 8023952.71894817
), Course = c(195.6, 196)), .Names = c("Easting", "Northing", 
"Easting2", "Northing2", "Course"), row.names = c(NA, -2L), class = c("tbl_df", 
"tbl", "data.frame"))


# function from the linked post, to calculate angles between vectors
angle2 <- function(M,N)
atan2(N[2],N[1]) - atan2(M[2],M[1]) 
        

df %>%
mutate(Easting.adj = Easting - Easting2,
    Northing.adj = Northing - Northing2,
    Course.rad = Course * pi / 180,
    Next.Easting2 = cos(Course.rad),
    Next.Northing2 = sin(Course.rad)) %>%
rowwise() %>%
mutate(Angle = angle2(c(Next.Easting2, Next.Northing2), c(Easting.adj, Northing.adj)),
    # convert back to degrees
    Angle = Angle * 180 / pi)

如果有两条线,这是一张 Google 地球图像。

【问题讨论】:

您能解释一下为什么您期望角度约为 340 / 325 度吗?也许有一张图纸? 显然忘了做 360-x,所以更像是 30-50 度。图片已添加,感谢提示 【参考方案1】:

对于所提供的数字,图像并不完全准确,因为Easting.adj 对第 1 行是负数,对第 2 行是正数。问题是因为数学角度是从 x 方向逆时针定义的,而您的航海角度当然似乎是从北方向顺时针定义的。应该使用90 - Course

df %>%
  mutate(Easting.adj = Easting - Easting2,
         Northing.adj = Northing - Northing2,
         Course.rad = (90 - Course) * pi / 180,
         Next.Easting2 = cos(Course.rad),
         Next.Northing2 = sin(Course.rad)) %>%
  rowwise() %>%
  mutate(Angle = angle2(c(Next.Easting2, Next.Northing2), c(Easting.adj, Northing.adj)),
         # convert back to degrees
         Angle = Angle * 180 / pi)

上面的代码生成 15.4 度和 29.6 度作为您的角度。或者,您可以保留角度:

df %>%
  mutate(Easting.adj = Easting - Easting2,
         Northing.adj = Northing - Northing2,
         math_course = 90 - Course) %>%
  rowwise() %>%
  mutate(direction = atan2(Northing.adj, Easting.adj) * 180 / pi,
         angle = direction - math_course)

【讨论】:

以上是关于点与向量之间的相对角度的主要内容,如果未能解决你的问题,请参考以下文章

pytorch自定义损失函数最小化向量之间的角度

千题案例TypeScript获取两点之间的距离 | 中点 | 补点 | 向量 | 角度

试图找到两个向量之间的角度(三角形)(HTML5 Canvas)

Unity中如何获取指定角度的方向向量

向量之间的角度 - 只有长度为1的数组可以转换为Python标量

支持向量机在 R语言中的实现和使用