Todos hemos visto una brújula, pero pocos saben usarla correctamente (me incluyo). El detalle es que actualmente la mayoría de los teléfonos celulares cuentan con una brújula en la que la lectura es azimutal (de 0 a 360º). De esa forma es sencillo establecer una dirección (o rumbo) a partir de nuestra posición.
Pero existe la costumbre de establecer un rumbo partiendo de cuadrantes, empezando por el norte o sur, indicando un número de grados hacia el este o el oeste. Por ejemplo, 281º azimutales serían N 79º W.
Si, lo se, suena algo complicado, pero este tipo de problemas me gustan mucho, mezclar algo de geometría con programación es la onda. Así que me puse a hacer un pequeño programa en Python que haga la conversión entre un rumbo azimutal (o circular) a un rumbo cuadrantal.
Las operaciones son diferentes dependiendo de en que cuadrante se encuentre la lectura azimutal. Agregué los rumbos francos que son el norte, sur, este y el oeste. Y además un mensaje de error en caso de que se introduzca un valor fuera de rango.
Una vez que hice la función, me di a la tarea de construirle una sencilla interfaz gráfica usando PySimpleGUI , no es la interfaz más bonita, pero es realmente sencillo de hacer, me tomó una mañana más o menos entenderle a la construcción de la interfaz y al manejo de eventos.
#! /usr/bin/env python3 import PySimpleGUI as sg # Esta función hace la conversión de grados azimutales a rumbos. def azimutal_rumbo(azimutal): # Rumbos Francos if (azimutal == 0) or (azimutal == 360): rumbo = 'N' elif azimutal == 90: rumbo = 'E' elif azimutal == 180: rumbo = 'S' elif azimutal == 270: rumbo = 'W' #Identificar los cuadrantes. #Cuadrante I elif (azimutal > 0) and (azimutal < 90): rumbo = 'N ' + str(azimutal) +'º E' #Cuadrante II elif (azimutal > 90) and (azimutal < 180): rumbo = 'S ' + str(180 - azimutal) + 'º E' #Cuadrante III elif (azimutal > 180) and (azimutal < 270): rumbo = 'S ' + str(azimutal - 180) + 'º W' #Cuadrante IV elif (azimutal > 270) and (azimutal < 360): rumbo = 'N ' + str(360 - azimutal) + 'º W' else: rumbo = 'Valor Incorrecto' return rumbo # Construir la interfaz gráfica. sg.theme('SystemDefault') layout = [ [sg.Text('Teclear el rumbo azimutal [0-360º]:',font='Default 12')], [sg.InputText(key='-GRADOSAZ-', size=(10,1), font='Default 12')], [sg.Button('Convertir', font='Default 12')], [sg.Text(size=(20,1), font='Default 18 bold', key='-RUMBO-')]] window = sg.Window('Azimutales a Rumbos').Layout(layout) while True: # The Event Loop event, values = window.read() # print(event, values) if event in (None, 'Exit'): break if event == 'Convertir': # Update the "output" text element to be the value of "input" element resultado = azimutal_rumbo(int(values['-GRADOSAZ-'])) window['-RUMBO-'].update(resultado) window.close()
Les quiero pedir disculpas si no uso los términos adecuados, no soy topógrafo, así que si existe una mejor manera de nombrar las cosas o si ofrecen algún consejo en cuanto a la programación les agradeceré su comentario.