relojes reloj recto que para obtuso manecillas las hora hallar grados forman entre cuarto angulos angulo agujas math floating-point precision angle

math - recto - Encontrar el ángulo entre las agujas de las horas y los minutos en un reloj analógico



que angulo forman las agujas del reloj a las 3 y cuarto (9)

Me dieron esta pregunta de la entrevista recientemente:

Dado un reloj analógico de 12 horas, calcule en grados el ángulo más pequeño entre las agujas de las horas y los minutos. Sea tan preciso como pueda.

Me pregunto cuál es el algoritmo más simple, más legible y más preciso. La solución en cualquier idioma es bienvenida (pero explique un poco si cree que es necesario).


El código de java que polygenlubricants es similar a la mía. Supongamos que el reloj es de 12 horas en lugar de 24.

Si son 24 horas, entonces esa es una historia diferente. Además, otra suposición, asuma si el reloj se detiene mientras calculamos esto.

Un ciclo de reloj es de 360 ​​grados.

  1. ¿Cuántos grados puede ejecutar el minutero por minuto? 360/60 = 6 grados por minuto.

  2. ¿Cuántos grados puede ejecutar la manecilla de la hora por hora? 360/12 = 30 grados por hora (ya que la manecilla de la hora funciona más lenta que el minuto)

Dado que es más fácil de calcular en la unidad, "minuto", consigamos

"¿cuántos grados puede ejecutar la manecilla de la hora por minuto"?

30/60 = 0.5 grados por minuto.

Por lo tanto, si sabes cómo obtener esos números, el problema está prácticamente solucionado.


Esta es una solución (C #). Esta es una solución muy simple e ignora la precisión. Espero que la solución sea autoexplicativa.

public static double GetAngle(int hourHand, int minuteHand) { double oneMinuteAngle = (360 / 60); double oneHourAngle = (360 / 12); double hourAngle = oneHourAngle * hourHand; double minuteAngle = oneMinuteAngle * minuteHand; return (Math.Abs(hourAngle - minuteAngle)); }


No sé si es correcto, ¿algo como esto?

//m*360/60 - (h*360/24)+(m*360/(24*60)) -> t = abs(25*m - 60*h)/4 t = min(t,360-t)


Para encontrar el ángulo entre las manecillas de un reloj,

30 * [HRS - (MIN/5)] + (MIN/2)


Prueba este código:

import java.util.Scanner; class Clock{ public static void main(String args[]){ int hours,mins; System.out.println("Enter the Time(hours) : "); Scanner dx = new Scanner(System.in); hours = dx.nextInt(); System.out.println("Enter the time(mins) : "); Scanner fx = new Scanner(System.in); mins = fx.nextInt(); if(hours>=0 && hours<=12){ if(mins>=0 && mins<=59){ double hDegrees = (hours * 30) + (mins * 0.5); double mDegrees = mins * 6; double diff = Math.abs(hDegrees - mDegrees); System.out.println("The angle between sticks is (degrees) : "+diff); if (diff > 180){ diff = 360 - diff; System.out.println("The angle between sticks is (degrees) : "+diff); } } } else{ System.out.println("Wrong input "); } } }


Resulta que Wikipedia tiene la mejor respuesta:

// h = 1..12, m = 0..59 static double angle(int h, int m) { double hAngle = 0.5D * (h * 60 + m); double mAngle = 6 * m; double angle = Math.abs(hAngle - mAngle); angle = Math.min(angle, 360 - angle); return angle; }

Básicamente:

  • La manecilla de la hora se mueve a razón de 0.5 grados por minuto
  • La manecilla de minutos se mueve a razón de 6 grados por minuto

Problema resuelto.

Y la precisión no es una preocupación porque la parte fraccionaria es .0 o .5 , y en el rango de 0..360 , todos estos valores son exactamente representables en double .


para encontrar el ángulo entre la manecilla de la hora y el minutero es

angle=(hour*5-min)*6


Ángulo de minuto (desde las 12 en punto) : 360 * minutos / 60

Ángulo de hora (desde las 12 en punto) : 360 * (hora% 12) / 12 + 360 * (minutos / 60) * (1/12)

Ángulo entre la hora y el minuto : (ángulo horario - ángulo minuto)% 360 Mediante aritmética simple, esto reduce a 30 * horas - 5.5 * minutos.


**php code for find angle via time (minutes and hour''s)** echo calcAngle(3,70); function calcAngle($h, $m) { // validate the input if ($h <0 || $m < 0 || $h >12 || $m > 60) { return "Wrong input"; } else { if ($h == 12) $h = 0; if ($m == 60) $m = 0; $hour_angle = 0.5 * ($h*60 + $m); $minute_angle = 6*$m; $angle = abs($hour_angle - $minute_angle); $angle = min(360-$angle, $angle); return $angle; } }