Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 给定4 Lat/Long和轴承的边界框_Java_Android_Latitude Longitude_Bounding Box - Fatal编程技术网

Java 给定4 Lat/Long和轴承的边界框

Java 给定4 Lat/Long和轴承的边界框,java,android,latitude-longitude,bounding-box,Java,Android,Latitude Longitude,Bounding Box,我需要找到一个给定4个lat/long点和一个方位的边界框(如示例图片所示)。我总是知道哪两个点是由轴承排列的(示例中的1和2),因此我总是知道边界框的长度。但是,宽度是任意的,点位于直线的任意位置(示例中为3和4) 我的第一个想法是,我必须计算点之间的角度(1&3,1&4,2&3,2&4),然后使用一系列“余弦定律”方程来计算角点。有没有更简单的方法?这行得通吗?因此,环顾四周,甚至询问可能更合适的站点(此处),我找到了一个基于Chris Vesies()的解决方案,以找到给定两点及其方位的

我需要找到一个给定4个lat/long点和一个方位的边界框(如示例图片所示)。我总是知道哪两个点是由轴承排列的(示例中的1和2),因此我总是知道边界框的长度。但是,宽度是任意的,点位于直线的任意位置(示例中为3和4)


我的第一个想法是,我必须计算点之间的角度(1&3,1&4,2&3,2&4),然后使用一系列“余弦定律”方程来计算角点。有没有更简单的方法?这行得通吗?

因此,环顾四周,甚至询问可能更合适的站点(此处),我找到了一个基于Chris Vesies()的解决方案,以找到给定两点及其方位的交点。因此,为了得到边界框的角点,我只需要取上/下和左/右(1&3,1&4,2&3,2&4)的每个组合,并使用已知的方向角找到交点,并进行相应的调整。例如,为了找到图像的右下角,我将使用点1方向的方向角+90和点3方向的方向角-180来计算点1和3的交点

我不能相信这个算法,甚至不能从几何角度解释它是如何工作的,但它在我的测试中起了作用。下面是Chris提供的javascript版本的java翻译

public static CoordD getIntersection(CoordD point1, double bearing1, CoordD point2, double bearning2) {
    double lat1 = rad(point1.latitude); double lon1 = rad(point1.longitude);
    double lat2 = rad(point2.latitude); double lon2 = rad(point2.longitude);
    double bearing13 = rad(bearing1); double bearing 23 = rad(bearing2);
    double dLat = lat2 - lat1; double dLon = lon2 - lon1;

    double dist12 = 2 * Math.asin( Math.sqrt( Math.sin(dLat / 2) * Math.sin(dLat / 2) +
        Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon / 2) * Math.sin(dLon / 2) ) );
    if (dist12 == 0) return null;

    double bearingA = Math.acos( ( Math.sin(lat2) - Math.sin(lat1) * Math.cos(dist12) ) /
        ( Math.sin(dist12) * Math.cos(lat1) ) );
    double bearingB = Math.acos( ( Math.sin(lat1) - Math.sin(lat2) * Math.cos(dist12) ) /
        ( Math.sin(dist12) * Math.cos(lat2) ) );
    if (Double.isNaN(bearingA)) bearingA = 0;
    if (Double.isNaN(bearingB)) bearingB = 0;

    double bearing12, bearing21;
    if (Math.sin(dLon) > 0) {
        bearing12 = bearingA;
        bearing21 = 2 * Math.PI - bearingB;
    } else { 
        bearing12 = 2 * Math.PI - bearingA;
        bearing21 = bearingB;
    }

    double alpha1 = (bearing13 - bearing12 + Math.PI) % (2 * Math.PI) - Math.PI; // Angle 2-1-3
    double alpha2 = (bearing21 - bearing23 + Math.PI) % (2 * Math.PI) - Math.PI; // Angle 1-2-3

    if (Math.sin(alpha1) == 0 && Math.sin(alpha2) == 0) return null; // Infinite intersections
    if (Math.sin(alpha1) * Math.sin(alpha2) < 0) return null; // Ambiguous intersection

    // needed?
    // alpha1 = Math.abs(alpha1);
    // alpha2 = Math.abs(alpha2);

    double alpha3 = Math.acos( -Math.cos(alpha1) * Math.cos(alpha2) +
        Math.sin(alpha1) * Math.sin(alpha2) * Math.cos(dist12) );
    double dist13 = Math.atan2( Math.sin(dist12) * Math.sin(alpha1) * Math.sin(alpha2),
        Math.cos(alpha2) + Math.cos(alpha1) * Math.cos(alpha3) );

    double lat3 = Math.asin( Math.sin(lat1) * Math.cos(dist13) +
        Math.cos(lat1) * Math.sin(dist13) * Math.cos(bearing13) );

    double dLon13 = Math.atan2( Math.sin(bearing13) * Math.sin(dist13) * Math.cos(lat1),
        Math.cos(dist13) - Math.sin(lat1) * Math.sin(lat3) );
    double lon3 = lon1 + dLon3;
    lon3 = (lon3 + 3 * Math.PI) % ( 2* Math.PI) - Math.PI // normalize to +/-180

    return new CoordD(deg(lat3), deg(lon3));
}
公共静态坐标GetCrossion(坐标点1、双轴承1、坐标点2、双轴承2){
双纬度1=rad(点1.纬度);双纬度1=rad(点1.经度);
双lat2=rad(点2.纬度);双lon2=rad(点2.经度);
双轴承13=rad(轴承1);双轴承23=rad(轴承2);
双dLat=lat2-lat1;双dLon=lon2-lon1;
双区12=2*Math.asin(Math.sqrt(Math.sin(dLat/2)*Math.sin(dLat/2)+
数学cos(lat1)*数学cos(lat2)*数学sin(dLon/2)*数学sin(dLon/2));
if(dist12==0)返回null;
双轴承a=Math.acos((Math.sin(lat2)-Math.sin(lat1)*Math.cos(dist12))/
(数学系(第12区)*数学系(第1区));
双轴承B=Math.acos((Math.sin(lat1)-Math.sin(lat2)*Math.cos(dist12))/
(数学系(第12区)*数学系(第2区));
如果(Double.isNaN(bearingA))bearingA=0;
如果(Double.isNaN(bearingB))bearingB=0;
双轴承12,轴承21;
如果(数学sin(dLon)>0){
轴承12=轴承A;
轴承21=2*Math.PI-轴承B;
}否则{
轴承12=2*Math.PI-轴承a;
轴承21=轴承B;
}
double alpha1=(bearing13-bearing12+Math.PI)%(2*Math.PI)-Math.PI;//角度2-1-3
双字母2=(bearing21-bearing23+Math.PI)%(2*Math.PI)-Math.PI;//角度1-2-3
if(Math.sin(alpha1)==0&&Math.sin(alpha2)==0)返回null;//无限交点
if(Math.sin(alpha1)*Math.sin(alpha2)<0)返回null;//不明确交集
//需要吗?
//alpha1=数学abs(alpha1);
//alpha2=数学abs(alpha2);
double alpha3=数学acos(-Math.cos(alpha1)*数学cos(alpha2)+
数学sin(alpha1)*数学sin(alpha2)*数学cos(dist12));
double dist13=数学atan2(数学sin(dist12)*数学sin(alpha1)*数学sin(alpha2),
数学cos(alpha2)+数学cos(alpha1)*数学cos(alpha3));
双lat3=数学asin(数学sin(lat1)*数学cos(dist13)+
数学cos(lat1)*数学sin(dist13)*数学cos(bearing13));
double dLon13=数学atan2(数学sin(轴承13)*数学sin(轴承13)*数学cos(轴承1),
Math.cos(dist13)-Math.sin(lat1)*Math.sin(lat3));
双lon3=lon1+dLon3;
lon3=(lon3+3*Math.PI)%(2*Math.PI)-Math.PI//标准化为+/-180
返回新坐标(deg(lat3)、deg(lon3));
}

rad()
deg()
只是在弧度和度之间转换的辅助函数
CoordD
是一个助手类,它只包含两个double来存储一个lat/long点。

感谢您发布您自己问题的答案。这并不是我想要的,因为我只有第1点和第2点。但是我根据你的代码片段计算了距离点1和点2 X的四个角。我不认为这个解决方案会给出一个旋转的矩形。如果我错了,请纠正我。