R 点和向量之间的相对角度

R 点和向量之间的相对角度,r,angle,R,Angle,我需要计算点数组和向量数组之间的角度(调整向量的方向)。我正在使用来自的angle2函数(基于atan2)来计算角度,但是我似乎做错了什么 数据为两条连续轨迹。一个轨迹带有航向值,另一个轨迹只是坐标。所以一个轨迹(东距2,北距2)是一个向量数组,另一个轨迹(东距,北距)只是点。我想我必须把这些点做成相对于另一个向量的向量,基于向量的轨迹,然后使用atan2方法。以下是我的思考过程: 使用track2(东距2,北距2)调整track1(东距,北距;即 轨道2成为轨道1的原点) 如果track2的步

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

数据为两条连续轨迹。一个轨迹带有航向值,另一个轨迹只是坐标。所以一个轨迹(东距2,北距2)是一个向量数组,另一个轨迹(东距,北距)只是点。我想我必须把这些点做成相对于另一个向量的向量,基于向量的轨迹,然后使用atan2方法。以下是我的思考过程:

  • 使用track2(东距2,北距2)调整track1(东距,北距;即 轨道2成为轨道1的原点)
  • 如果track2的步长为1,则计算一组坐标 与给定的track2路线方向相同(这是next.easting和next.northing)
  • 计算重新定位的轨迹1和轨道1之间的角度 轨道2的假想点
  • 但是,在这里的示例中,我希望第一排的角度为~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)
    
    库(dplyr)
    df%
    行()
    变异(角度=角度2(c(Next.Easting2,Next.Northing2),c(Easting.adj,Northing.adj)),
    #转换回度数
    角度=角度*180/pi)
    
    这是谷歌地球的图片,如果这两条线。
    图像对于所提供的数字并不完全准确,因为
    Easting.adj
    对于第1行为负数,对于第2行为正数。这个问题是因为数学角度是从x方向逆时针定义的,而你的航海路线似乎是从北方向顺时针定义的。应该使用
    90-课程

    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)
    

    你能解释一下为什么预期角度为340/325度吗?也许是画画?显然忘了画360度,所以更像是30-50度。图片已添加,谢谢您的提示