Busco una forma rápida, preferiblemente sin operaciones trigonométricas (sólo multiplicar, dividir, sumar, cuadrar y restar) para determinar si un punto es visible. Por ejemplo, digamos que estoy frente a 0 grados N, estoy en 51.40,-1.08, la cámara tiene un HFOV de 30 grados y el punto está en 51.20,-1.085 debería devolver VERDADERO, porque el punto estaría frente a mí y está dentro del FOV de 30 grados.
Se requiere que devuelva VERDADERO (falso positivo) en lugar de FALSO dados los casos de borde, de lo contrario los puntos pueden estar ocultos cuando son realmente visibles. Actualmente tengo mi proyecto de realidad aumentada usando atan2 para calcular el ángulo real, pero si puedo afeitar los cálculos de los puntos que definitivamente no son visibles, cada pequeño detalle ayuda. Sólo necesito que sea preciso en distancias de menos de 2 km.
Aquí está mi código para calcular la posición horizontal y vertical. Sólo es preciso en distancias de <5 km, pero la precisión no es crítica de todos modos, ya que esos puntos de ruta no están dibujados. Este proyecto es de código abierto, así que está bien que publique mucho código.
res->est_dist = hypot2(p_viewer->p.lat - p_subj->lat, p_viewer->p.lon - p_subj->lon) * 2000.0f;
// Save precious cycles if outside of visible world.
if(res->est_dist > cliph)
goto quick_exit;
// Compute the horizontal and vertical angle to the point.
res->h_angle = angle_dist_deg(RAD2DEG(atan2(p_viewer->p.lon - p_subj->lon, p_viewer->p.lat - p_subj->lat)), p_viewer->yaw);
res->v_angle = RAD2DEG(atan2(p_viewer->p.alt - p_subj->alt, res->est_dist)); // constant scale factor: needs to be adjusted
// Normalize the results to fit in the field of view of the camera.
res->h_angle += p_viewer->hfov / 2;
res->v_angle += p_viewer->vfov / 2;
// Compute projected X and Y position.
res->pos.x = (res->h_angle / p_viewer->hfov) * p_viewer->width;
res->pos.y = (res->v_angle / p_viewer->vfov) * p_viewer->height;
¿Ves esa llamada a atan2 para el h_ángulo? Si pudiera eliminarla diciendo "este punto definitivamente no es visible" estaría bien.