/* packimport tkinter as tk
import math
class BrujulaApp:
def __init__(self, root):
self.root = root
self.root.title("Brújula Digital")
self.root.geometry("400x450")
self.root.configure(bg="#1e1e1e")
# Grados iniciales (0 = Norte)
self.grados = 0
# Crear título
self.label_titulo = tk.Label(root, text="BRÚJULA", font=("Arial", 16, "bold"), fg="white", bg="#1e1e1e")
self.label_titulo.pack(pady=10)
# Crear área de dibujo (Canvas)
self.canvas = tk.Canvas(root, width=300, height=300, bg="#1e1e1e", highlightthickness=0)
self.canvas.pack()
# Control deslizable para simular el movimiento físico de la brújula
self.scale = tk.Scale(root, from_=0, to=360, orient="horizontal", command=self.actualizar_rumbo,
bg="#1e1e1e", fg="white", highlightthickness=0, troughcolor="#333333")
self.scale.pack(fill="x", padx=40, pady=10)
# Etiqueta de texto para los puntos cardinales
self.label_info = tk.Label(root, text="0° N", font=("Arial", 14), fg="#00ffcc", bg="#1e1e1e")
self.label_info.pack()
# Dibujar por primera vez
self.dibujar_brujula()
def obtener_punto_cardinal(self, grados):
if 337.5 <= grados or grados < 22.5: return "N"
if 22.5 <= grados < 67.5: return "NE"
if 67.5 <= grados < 112.5: return "E"
if 112.5 <= grados < 157.5: return "SE"
if 157.5 <= grados < 202.5: return "S"
if 202.5 <= grados < 247.5: return "SO"
if 247.5 <= grados < 292.5: return "O"
return "NO"
def actualizar_rumbo(self, valor):
self.grados = int(valor)
rumbo = self.obtener_punto_cardinal(self.grados)
self.label_info.config(text=f"{self.grados}° {rumbo}")
self.dibujar_brujula()
def dibujar_brujula(self):
self.canvas.delete("all")
cx, cy, r = 150, 150, 120
# Dibujar el anillo exterior
self.canvas.create_oval(cx-r, cy-r, cx+r, cy+r, outline="white", width=3)
# Marcas de texto fijas de los puntos cardinales principales
self.canvas.create_text(cx, cy-r+15, text="N", fill="red", font=("Arial", 12, "bold"))
self.canvas.create_text(cx, cy+r-15, text="S", fill="white", font=("Arial", 12, "bold"))
self.canvas.create_text(cx+r-15, cy, text="E", fill="white", font=("Arial", 12, "bold"))
self.canvas.create_text(cx-r+15, cy, text="O", fill="white", font=("Arial", 12, "bold"))
# Calcular el ángulo de la aguja en radianes
# Se resta 90 grados debido a que el sistema de coordenadas de la pantalla empieza en el eje X (Este)
angulo_rad = math.radians(self.grados - 90)
# Coordenadas de la punta de la aguja (Norte Magnético)
nx = cx + (r - 30) * math.cos(angulo_rad)
ny = cy + (r - 30) * math.sin(angulo_rad)
# Coordenadas de la parte trasera de la aguja (Sur)
sx = cx - (r - 30) * math.cos(angulo_rad)
sy = cy - (r - 30) * math.sin(angulo_rad)
# Dibujar la aguja (Línea roja para el Norte, blanca para el Sur)
self.canvas.create_line(cx, cy, nx, ny, fill="red", width=4, arrow="last")
self.canvas.create_line(cx, cy, sx, sy, fill="white", width=4)
# Centro de la aguja
self.canvas.create_oval(cx-5, cy-5, cx+5, cy+5, fill="gray")
# Inicializar aplicación
if __name__ == "__main__":
root = tk.Tk()
app = BrujulaApp(root)
root.mainloop()
age whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
// your code goes here
}
}
LyogcGFja2ltcG9ydCB0a2ludGVyIGFzIHRrCmltcG9ydCBtYXRoCgpjbGFzcyBCcnVqdWxhQXBwOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgogICAgICAgIHNlbGYucm9vdCA9IHJvb3QKICAgICAgICBzZWxmLnJvb3QudGl0bGUoIkJyw7pqdWxhIERpZ2l0YWwiKQogICAgICAgIHNlbGYucm9vdC5nZW9tZXRyeSgiNDAweDQ1MCIpCiAgICAgICAgc2VsZi5yb290LmNvbmZpZ3VyZShiZz0iIzFlMWUxZSIpCgogICAgICAgICMgR3JhZG9zIGluaWNpYWxlcyAoMCA9IE5vcnRlKQogICAgICAgIHNlbGYuZ3JhZG9zID0gMAoKICAgICAgICAjIENyZWFyIHTDrXR1bG8KICAgICAgICBzZWxmLmxhYmVsX3RpdHVsbyA9IHRrLkxhYmVsKHJvb3QsIHRleHQ9IkJSw5pKVUxBIiwgZm9udD0oIkFyaWFsIiwgMTYsICJib2xkIiksIGZnPSJ3aGl0ZSIsIGJnPSIjMWUxZTFlIikKICAgICAgICBzZWxmLmxhYmVsX3RpdHVsby5wYWNrKHBhZHk9MTApCgogICAgICAgICMgQ3JlYXIgw6FyZWEgZGUgZGlidWpvIChDYW52YXMpCiAgICAgICAgc2VsZi5jYW52YXMgPSB0ay5DYW52YXMocm9vdCwgd2lkdGg9MzAwLCBoZWlnaHQ9MzAwLCBiZz0iIzFlMWUxZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wKQogICAgICAgIHNlbGYuY2FudmFzLnBhY2soKQoKICAgICAgICAjIENvbnRyb2wgZGVzbGl6YWJsZSBwYXJhIHNpbXVsYXIgZWwgbW92aW1pZW50byBmw61zaWNvIGRlIGxhIGJyw7pqdWxhCiAgICAgICAgc2VsZi5zY2FsZSA9IHRrLlNjYWxlKHJvb3QsIGZyb21fPTAsIHRvPTM2MCwgb3JpZW50PSJob3Jpem9udGFsIiwgY29tbWFuZD1zZWxmLmFjdHVhbGl6YXJfcnVtYm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnPSIjMWUxZTFlIiwgZmc9IndoaXRlIiwgaGlnaGxpZ2h0dGhpY2tuZXNzPTAsIHRyb3VnaGNvbG9yPSIjMzMzMzMzIikKICAgICAgICBzZWxmLnNjYWxlLnBhY2soZmlsbD0ieCIsIHBhZHg9NDAsIHBhZHk9MTApCgogICAgICAgICMgRXRpcXVldGEgZGUgdGV4dG8gcGFyYSBsb3MgcHVudG9zIGNhcmRpbmFsZXMKICAgICAgICBzZWxmLmxhYmVsX2luZm8gPSB0ay5MYWJlbChyb290LCB0ZXh0PSIwwrAgTiIsIGZvbnQ9KCJBcmlhbCIsIDE0KSwgZmc9IiMwMGZmY2MiLCBiZz0iIzFlMWUxZSIpCiAgICAgICAgc2VsZi5sYWJlbF9pbmZvLnBhY2soKQoKICAgICAgICAjIERpYnVqYXIgcG9yIHByaW1lcmEgdmV6CiAgICAgICAgc2VsZi5kaWJ1amFyX2JydWp1bGEoKQoKICAgIGRlZiBvYnRlbmVyX3B1bnRvX2NhcmRpbmFsKHNlbGYsIGdyYWRvcyk6CiAgICAgICAgaWYgMzM3LjUgPD0gZ3JhZG9zIG9yIGdyYWRvcyA8IDIyLjU6IHJldHVybiAiTiIKICAgICAgICBpZiAyMi41IDw9IGdyYWRvcyA8IDY3LjU6IHJldHVybiAiTkUiCiAgICAgICAgaWYgNjcuNSA8PSBncmFkb3MgPCAxMTIuNTogcmV0dXJuICJFIgogICAgICAgIGlmIDExMi41IDw9IGdyYWRvcyA8IDE1Ny41OiByZXR1cm4gIlNFIgogICAgICAgIGlmIDE1Ny41IDw9IGdyYWRvcyA8IDIwMi41OiByZXR1cm4gIlMiCiAgICAgICAgaWYgMjAyLjUgPD0gZ3JhZG9zIDwgMjQ3LjU6IHJldHVybiAiU08iCiAgICAgICAgaWYgMjQ3LjUgPD0gZ3JhZG9zIDwgMjkyLjU6IHJldHVybiAiTyIKICAgICAgICByZXR1cm4gIk5PIgoKICAgIGRlZiBhY3R1YWxpemFyX3J1bWJvKHNlbGYsIHZhbG9yKToKICAgICAgICBzZWxmLmdyYWRvcyA9IGludCh2YWxvcikKICAgICAgICBydW1ibyA9IHNlbGYub2J0ZW5lcl9wdW50b19jYXJkaW5hbChzZWxmLmdyYWRvcykKICAgICAgICBzZWxmLmxhYmVsX2luZm8uY29uZmlnKHRleHQ9ZiJ7c2VsZi5ncmFkb3N9wrAge3J1bWJvfSIpCiAgICAgICAgc2VsZi5kaWJ1amFyX2JydWp1bGEoKQoKICAgIGRlZiBkaWJ1amFyX2JydWp1bGEoc2VsZik6CiAgICAgICAgc2VsZi5jYW52YXMuZGVsZXRlKCJhbGwiKQogICAgICAgIGN4LCBjeSwgciA9IDE1MCwgMTUwLCAxMjAKCiAgICAgICAgIyBEaWJ1amFyIGVsIGFuaWxsbyBleHRlcmlvcgogICAgICAgIHNlbGYuY2FudmFzLmNyZWF0ZV9vdmFsKGN4LXIsIGN5LXIsIGN4K3IsIGN5K3IsIG91dGxpbmU9IndoaXRlIiwgd2lkdGg9MykKCiAgICAgICAgIyBNYXJjYXMgZGUgdGV4dG8gZmlqYXMgZGUgbG9zIHB1bnRvcyBjYXJkaW5hbGVzIHByaW5jaXBhbGVzCiAgICAgICAgc2VsZi5jYW52YXMuY3JlYXRlX3RleHQoY3gsIGN5LXIrMTUsIHRleHQ9Ik4iLCBmaWxsPSJyZWQiLCBmb250PSgiQXJpYWwiLCAxMiwgImJvbGQiKSkKICAgICAgICBzZWxmLmNhbnZhcy5jcmVhdGVfdGV4dChjeCwgY3krci0xNSwgdGV4dD0iUyIsIGZpbGw9IndoaXRlIiwgZm9udD0oIkFyaWFsIiwgMTIsICJib2xkIikpCiAgICAgICAgc2VsZi5jYW52YXMuY3JlYXRlX3RleHQoY3grci0xNSwgY3ksIHRleHQ9IkUiLCBmaWxsPSJ3aGl0ZSIsIGZvbnQ9KCJBcmlhbCIsIDEyLCAiYm9sZCIpKQogICAgICAgIHNlbGYuY2FudmFzLmNyZWF0ZV90ZXh0KGN4LXIrMTUsIGN5LCB0ZXh0PSJPIiwgZmlsbD0id2hpdGUiLCBmb250PSgiQXJpYWwiLCAxMiwgImJvbGQiKSkKCiAgICAgICAgIyBDYWxjdWxhciBlbCDDoW5ndWxvIGRlIGxhIGFndWphIGVuIHJhZGlhbmVzCiAgICAgICAgIyBTZSByZXN0YSA5MCBncmFkb3MgZGViaWRvIGEgcXVlIGVsIHNpc3RlbWEgZGUgY29vcmRlbmFkYXMgZGUgbGEgcGFudGFsbGEgZW1waWV6YSBlbiBlbCBlamUgWCAoRXN0ZSkKICAgICAgICBhbmd1bG9fcmFkID0gbWF0aC5yYWRpYW5zKHNlbGYuZ3JhZG9zIC0gOTApCgogICAgICAgICMgQ29vcmRlbmFkYXMgZGUgbGEgcHVudGEgZGUgbGEgYWd1amEgKE5vcnRlIE1hZ27DqXRpY28pCiAgICAgICAgbnggPSBjeCArIChyIC0gMzApICogbWF0aC5jb3MoYW5ndWxvX3JhZCkKICAgICAgICBueSA9IGN5ICsgKHIgLSAzMCkgKiBtYXRoLnNpbihhbmd1bG9fcmFkKQoKICAgICAgICAjIENvb3JkZW5hZGFzIGRlIGxhIHBhcnRlIHRyYXNlcmEgZGUgbGEgYWd1amEgKFN1cikKICAgICAgICBzeCA9IGN4IC0gKHIgLSAzMCkgKiBtYXRoLmNvcyhhbmd1bG9fcmFkKQogICAgICAgIHN5ID0gY3kgLSAociAtIDMwKSAqIG1hdGguc2luKGFuZ3Vsb19yYWQpCgogICAgICAgICMgRGlidWphciBsYSBhZ3VqYSAoTMOtbmVhIHJvamEgcGFyYSBlbCBOb3J0ZSwgYmxhbmNhIHBhcmEgZWwgU3VyKQogICAgICAgIHNlbGYuY2FudmFzLmNyZWF0ZV9saW5lKGN4LCBjeSwgbngsIG55LCBmaWxsPSJyZWQiLCB3aWR0aD00LCBhcnJvdz0ibGFzdCIpCiAgICAgICAgc2VsZi5jYW52YXMuY3JlYXRlX2xpbmUoY3gsIGN5LCBzeCwgc3ksIGZpbGw9IndoaXRlIiwgd2lkdGg9NCkKICAgICAgICAKICAgICAgICAjIENlbnRybyBkZSBsYSBhZ3VqYQogICAgICAgIHNlbGYuY2FudmFzLmNyZWF0ZV9vdmFsKGN4LTUsIGN5LTUsIGN4KzUsIGN5KzUsIGZpbGw9ImdyYXkiKQoKIyBJbmljaWFsaXphciBhcGxpY2FjacOzbgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgcm9vdCA9IHRrLlRrKCkKICAgIGFwcCA9IEJydWp1bGFBcHAocm9vdCkKICAgIHJvb3QubWFpbmxvb3AoKQogICAgCiAgICAKICAgIGFnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCX0KfQ==