Java: rotar un punto alrededor de otro utilizando las coordenadas de Google Maps

De Google Earth obtuve un cuadro con coordenadas para una imagen, como la siguiente:

    <LatLonBox>
        <north>53.10685</north>
        <south>53.10637222222223</south>
        <east>8.853144444444444</east>
        <west>8.851858333333333</west>
        <rotation>-26.3448</rotation>
    </LatLonBox>

Ahora quiero probar el clima, un punto se cruza con este LatLonBox. Mi idea básica para verificar si un punto se cruza con el LatLonBox era girar el punto hacia atrás en el ángulo dado y luego probar si el punto se cruza con un rectángulo regular (no girado).

Traté de calcular la rotación manualmente:

public static MyGeoPoint rotatePoint(MyGeoPoint point, MyGeoPoint origion, double degree)
{
double x = origion.getLatitude() + (Math.cos(Math.toRadians(degree)) * (point.getLatitude() - origion.getLatitude()) - Math.sin(Math.toRadians(degree)) * (point.getLongitude() - origion.getLongitude()));
double y =  origion.getLongitude()  + (Math.sin(Math.toRadians(degree)) * (point.getLatitude() - origion.getLatitude()) + Math.cos(Math.toRadians(degree))  * (point.getLongitude() - origion.getLongitude()));

return new MyGeoPoint(x, y);

}

public boolean intersect(MyGeoPoint geoPoint)
{   
    geoPoint = MyGeoPoint.rotatePoint(geoPoint, this.getCenter(), - this.getRotation());

    return (geoPoint.getLatitude() < getTopLeftLatitude()
            && geoPoint.getLatitude() > getBottomRightLatitude()
                && geoPoint.getLongitude() > getTopLeftLongitude()
                    && geoPoint.getLongitude() < getBottomRightLongitude());
}

Y parece que los resultados son incorrectos.

    LatLonBox box = new LatLonBox(53.10685, 8.851858333333333, 53.10637222222223, 8.853144444444444, -26.3448);

    MyGeoPoint point1 = new MyGeoPoint(53.106872, 8.852311);
    MyGeoPoint point2 = new MyGeoPoint(53.10670378322918, 8.852967186822669);   
    MyGeoPoint point3 = new MyGeoPoint(53.10652664993972, 8.851994565566875);
    MyGeoPoint point4 = new MyGeoPoint(53.10631650700605, 8.85270995172055);

    System.out.println(box.intersect(point1));
    System.out.println(box.intersect(point2));
    System.out.println(box.intersect(point3));
    System.out.println(box.intersect(point4));

El resultado es verdadero, falso, falso, verdadero. Pero debería ser 4 veces cierto. Probablemente yo, cometiendo algún tipo de error en el razonamiento. Tal vez porque los valores de latitud se hacen más grandes hacia arriba. Pero no sé cómo cambiar el formulario.

Necesito algo de ayuda ...


EDITAR: Creo que mi idea básica y mi formulario son correctos. También encontré soluciones similares, por ejemplo. enlace y no pude encontrar ninguna diferencia.

Así que creo que la única fuente de error posible es que los ejes no son proporcionales. Entonces, el problema es cómo tener esto en cuenta.

Espero que alguien tenga una idea.

Respuesta 1

El problema era que los ejes no eran proporcionales.

El siguiente método se encarga de ello.

public static MyGeoPoint rotatePoint(MyGeoPoint point, MyGeoPoint origion, double degree)
{
double x =  origion.longitude   + (Math.cos(Math.toRadians(degree)) * (point.longitude - origion.longitude) - Math.sin(Math.toRadians(degree))  * (point.latitude - origion.latitude) / Math.abs(Math.cos(Math.toRadians(origion.latitude)));
double y = origion.latitude + (Math.sin(Math.toRadians(degree)) * (point.longitude - origion.longitude) * Math.abs(Math.cos(Math.toRadians(origion.latitude))) + Math.cos(Math.toRadians(degree))   * (point.latitude - origion.latitude));
return new MyGeoPoint(x, y);
}
Respuesta: 2

si entiendo correctamente, desea verificar si estos cuatro puntos están en un rectángulo girado.

Recomendaría verificar no por puntos de esquina porque su rectángulo está girado pero:

si ha girado el rectángulo ABCD, calcule las líneas | AB |, | BC |, | CD | y | DA |. Si tienes dos puntos, usa y = ax + b (calcularás a, b dando [x, y] de ambas coordenadas que te dan dos ecuaciones fáciles).

Finalmente la función de intersección verificará

  if point <= line |CD| 
      AND point >= line |AB|
          AND point <= line |BC|
             AND point >= |DA|

entonces está dentro de rect.

Esto se puede hacer cuando tu punto P [x, y] pones en ax + y + b (a> 0 o -ax-yb). Si es cero, está en la línea, si es <de lo que está debajo de la línea o "en el lado izquierdo". Espero haber ayudado ...

Por cierto, ¿por qué estás usando -degree value, que multiplicas por -1, es necesario?

Respuesta: 3

Tengo un proyecto 1 que necesita ejecutarse en 1.7, este proyecto depende de otro proyecto 2 construido en 1.8. Estoy tratando de invocar una clase del Proyecto 2 dentro del Proyecto 1, pero estoy recibiendo un conocido ...

Estoy creando un sitio web con el motor de aplicaciones de Google, pero tengo una pregunta sobre los servlets del lado del servidor y cómo interactúan con la base de datos del almacén de datos. Básicamente, se trata de la carrera tradicional ...

Le di un archivo XML y una etiqueta contiene varios atributos. Sin embargo, uno de ellos a veces se salta. Exampe: <data> <item attribute0 = "value 0" attribute1 = "value 1" attribute2 = "value ...

¿hay alguna propiedad CSS que establezca el radio del círculo? Intuitivamente he intentado "fx-radius" o "fx-size" pero no es así. No quiero establecer cada radio de círculo por separado en el archivo fxml; <...