两个点已知一个点的方向,判断另一个点在这个的方位(左前/右后) 您所在的位置:网站首页 桐乡位置与那个方向 两个点已知一个点的方向,判断另一个点在这个的方位(左前/右后)

两个点已知一个点的方向,判断另一个点在这个的方位(左前/右后)

2024-06-08 08:12| 来源: 网络整理| 查看: 265

使用条件:已知两个点的经纬度,以及一个点(这个点为主点,另一个点为副点)的方向(是一个在原始坐标系上的角度),该方向是由定位自动获取的;

备注:原始坐标系:以正北为y轴正方向, 其中经度为x轴,纬度为y轴

   主点坐标系:以主点的方向为y轴正方向,其中以主点的方向所在的直线为y轴,过主点且与y轴垂直的直线为x轴,

第一步:求出副点在原始坐标系上的方向,

//根据两个点的经纬度,以一个点(userLocationCoordinate)为坐标中心,y轴正方向为正北方向(即为 0°),求出另一个点(rodeLocationCoordinate)关于正北方向的角度(0° ~ 360°) - (double)judgeAngle:(CLLocationCoordinate2D)userLocationCoordinate andRoadInfoCoordinate:(CLLocationCoordinate2D)rodeLocationCoordinate { double a = rodeLocationCoordinate.longitude - userLocationCoordinate.longitude; //经度差 double b = rodeLocationCoordinate.latitude - userLocationCoordinate.latitude; //纬度差 double c = hypot(fabs(a), fabs(b)); double cosy = 0.0; double angle = 0; if (a > 0 && b > 0) { // 判断road点在user点的东北位置 cosy = b / c; angle = 0; }else if (a == 0 && b > 0) { //在正北位置 angle = -90; }else if (a > 0 && b < 0) { // 判断road点在user点的东南位置 cosy = a / c; angle = 90; }else if (a > 0 && b == 0) { //在正东位置 angle = 90; }else if (a < 0 && b < 0) { // 判断road点在user点的西南位置 cosy = fabs(b) / c; angle = 180; }else if (a == 0 && b < 0) { //在正南位置 angle = 90; }else if (a < 0 && b > 0) { // 判断road点在user点的西北位置 cosy = fabs(a) / c; angle = 270; }else if (a < 0 && b == 0) { //在正西位置 angle = 180; } double m = acos(cosy); //n 即以正北为 0 的总角度 double n = ( m / M_PI ) * 180 + angle; return n; } 第二步:先将副点的坐标系从原始坐标系转换到主点坐标系。下面代码中返回值即是相应的方位

原理:从两个点在原始坐标系的方向(角度)来判断,当副点的原方向小于主点的原方向时,副点在主点坐标系上的方向为 “副点原方向 + 360° - 主点原方向”;当副点的原方向小于主点的原方向时,副点在主点坐标系的方向为 “副点原方向 - 主点原方向”,以此来求出副点主方向,当副点主方向大于0小于90时,副点在主点的右前方,当副点主方向等于90时,副点在主点的正右方,以此类推,这样就能判断出副点在主点的方位了

备注:副点原方向:第一步中求出的 副点在原始坐标系中的方向;

  主点原方向:已知条件中的主点基于原始坐标系的方向;

  副点主坐标:副点基于主点坐标系中的方向;

//根据两个点经纬度和主点(userLocationCoordinate)的角度,判断出另一个点(rodeLocationCoordinate)在主点的方位 - (int)judgeDirection:(CLLocationCoordinate2D)userLocationCoordinate andRoadInfo:(CLLocationCoordinate2D)rodeLocationCoordinate andUserAngle:(double)userAngle{ double roadAngle = [self judgeAngle:userLocationCoordinate andRoadInfoCoordinate:rodeLocationCoordinate]; double angleGap = roadAngle - userAngle; int direction = 0; if (angleGap < 0) { angleGap = roadAngle + 360 - userAngle; }else { angleGap = roadAngle - userAngle; } if (angleGap > 0 && angleGap < 90) { // road点在user点的右前方 direction = 1; }else if(angleGap == 90){ // road点在user点的正右方 direction = 2; }else if (angleGap > 90 && angleGap < 180) { // road点在user点的右后方 direction = 3; }else if(angleGap == 180){ // road点在user点的正后方 direction = 4; }else if (angleGap > 180 && angleGap < 270) { // road点在user点的左后方 direction = 5; }else if(angleGap == 270){ // road点在user点的正左方 direction = 6; }else if (angleGap > 270 && angleGap < 360) { // road点在user点的左前方 direction = 7; }else if(angleGap == 0){ // road点在user点的正前方 direction = 0; } return direction; }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有