# -*- coding:Utf-8 -*-
from math import sqrt, atan, pi, cos, acos, sin, asin
"""
    Distance angulaire entre deux points d'une photos numérique
    Alain LERAUT - février 2016
    Sur une idée de Gérard Cloarec
"""
"""          valeurs liées à l'appareil photographique             """
larg_en_pixels   = 2400
haut_en_pixels   = 1800
larg_en_mm       = 24.0 # en valeur décimale
haut_en_mm       = 18.0 # en valeur décimale
focale              = 100
"""  position des centres des deux objet en pixels
    cette position est déterminée par rapport au coin haut-gauche """
xA_pixels        = 700
yA_pixels        = 600
xB_pixels        = 400
yB_pixels        = 1100

"""  zone des calculs simplifiés et très approximatifs"""
print("CALCUL DE LA DISTANCE ANGULAIRE À PARTIR D'UNE PHOTO NUMÉRIQUE")
print("-----")
print("Traitement de l'exemple accompagnant le document PDF")
print("-----")
eq_pix_mm   =   larg_en_mm / larg_en_pixels
print("Equivalent pixel-millimètre : {} ".format(eq_pix_mm))
AC = (xA_pixels - xB_pixels) * eq_pix_mm
BC = (yA_pixels - yB_pixels) * eq_pix_mm
AB = sqrt(AC**2 + BC**2)
print("Valeur de AB : {} millimètres".format(AB))
rapport = AB / focale
angle_rad = atan(rapport)
print("Angle à peu près : {} radians".format(angle_rad))
print("Angle à peu près : {} degrés".format(angle_rad* 180 / pi))

""" ---- exemple du formulaire ---
http://www.warmaths.fr/MATH/geometr/TRIGONOMETRIE/reltrigotriqcq.htm#cas3
"""
a = 118.0
b = 65.90
c = 80.55
print("Les exemples du formulaire en ligne")
print("-----")
cos_A  = (b**2 + c**2 - a**2) / (2 * b * c)
print("Cosinus de A      :{}  ".format(cos_A))
A_rad = acos(abs(cos_A))
print("Angle A           : {} degrés ".format(A_rad *180 / pi))
sin_B = (b * sin(A_rad)) / a
print("Valeur de sinus B : {} ".format(sin_B))
B_rad = asin(abs(sin_B))
print("Angle B           : {} degrés ".format(B_rad * 180/pi))

""" --- vraie solution ---- """
dist_xpix_centre = larg_en_pixels / 2
dist_ypix_centre = 1800 / 2
AQ = sqrt(((dist_xpix_centre - xA_pixels)**2) + ((dist_ypix_centre - yA_pixels)**2))
AQ = AQ * eq_pix_mm
print("AQ                : {} en millimètres".format(AQ)) 
BQ = sqrt(((dist_xpix_centre - xB_pixels)**2) + ((dist_ypix_centre - yB_pixels)**2))
BQ = BQ * eq_pix_mm
print("BQ                : {}  en millimètres".format(BQ))
AP = sqrt(AQ ** 2 + focale ** 2)
BP = sqrt(BQ ** 2 + focale ** 2)
print("Distance du centre de l'objectif au point A (AP) : {} millimètres".format(AP))
print("Distance du centre de l'objectif au point B  'BP) : {} millimètres".format(BP))

""" --- on réaffecte les valeurs dans l'exemple du formulaire et on applique les formules """

a = BP
b = AB
c = AP
print
print("Application du formulaire en ligne")

cos_A  = (b**2 + c**2 - a**2) / (2 * b * c)
print("Cosinus de A      :{}  ".format(cos_A))
A_rad = acos(abs(cos_A))
sin_B = (b * sin(A_rad)) / a
B_rad = asin(abs(sin_B))
print("Angle B           : {} degrés ".format(B_rad * 180/pi))
