Comunidad de diseño web y desarrollo en internet online

Sumar grados, minutos y segundos en PHP.

Citar            
MensajeEscrito el 01 Mar 2013 06:42 am
Hola amigos y amigas. Me encuentro desarrollando un pequeño script que necesito que sume angulos del mismo modo que lo hacíamos en la escuela. Por ejemplo con números al azar:

34º23'56"+xºx'x"

El problema surge en efecto cuando yo debo pasar de los segundos a los minutos y de los minutos a los grados. Soy primerizo así que pido piedad por la precariedad de mi código.

No obstante el asunto no es tan simple como parece y antes voy a comentarles que este script suma o mejor dicho debe realizar una conversión de grados de arco (en el cielo) a tiempo u hora normal de reloj.

Las premisas son las siguientes:

15 grados de arco son iguales a 1 hora de tiempo reloj o normal.

15 minutos de arco son iguales a 1 minuto de tiempo reloj o normal.

15 segundos de arco son iguales a 1 segundo de tiempo reloj o normal.

O sea que decir que un punto en el cielo dista de otro 45 º es equivalente a decir que dista 3 horas porque 45 / 15 = 3.

Hacer la conversión según el libro que tengo es facil porque solo debo tomar cada elemento del angulo por separado y multiplicarlo por 4. Entonces si tengo:

8º de arco x 4 = 32 minutos tiempo normal.

30 ' de arco x 4 = 2 minutos tiempo normal.

15" de arco x 4 = 1 S tiempo normal.

Y aquí surge el problema porque en mi script yo tengo lo siguiente:

Código PHP :

function calcularhora($grados,$minutos,$segundos){

$valor1= $grados*4;
$valor2 = $minutos * 4;
$valor3 = $segundos * 4 ; 

while ($valor2 >= 60) {$valor2=$valor2 -60;

$valor1 = $valor1+1;

}

echo $valor1;



echo "<br>";
echo round ($valor2);
echo "<br>";

calcularhora(8,30,15);


Con el ejemplo anterior (8º 30' 15") este código hace la conversión de forma correcta... ahora bien con valores mas grandes surgen problemas con los grados. No sucede lo mismo con el siguiente valor por ejemplo: 69º 7' x" porque 69 da 276 que hasta donde yo entiendo debo dividirlo por 15 para obtener la cantidad de horas (según un fulano de la Internet son 6 horas) que es 4,6.


Cualquier sugerencia para realizar esta conversión de la forma más exacta posible es super bienvenida. Creo que la parte más compleja que no logro descular son los grados ya que debo realizar una división para que estos sean convertidos a horas usando el sistema sexagesimal.

Por lordoracle

Claber

430 de clabLevel

5 tutoriales

 

I am a Wordpress Guy

chrome
Citar            
MensajeEscrito el 01 Mar 2013 10:33 am
Veo un fallo a simple vista en la correlaciones:

lordoracle escribió:

15 segundos de arco son iguales a 1 segundo de tiempo reloj o normal.

lordoracle escribió:

15" de arco x 4 = 1 S tiempo normal

Si 15 segundos de arco son 1 segundo, entonces (15*4) segundos de arco, no pueden ser también 1 segundo.

Voy a intentar ayudarte suponiendo que las primeras relaciones entre medidas que haces son correctas

lordoracle escribió:

15 grados de arco son iguales a 1 hora de tiempo reloj o normal.
15 minutos de arco son iguales a 1 minuto de tiempo reloj o normal.
15 segundos de arco son iguales a 1 segundo de tiempo reloj o normal.

Código PHP :

function calcularhora ($gr, $mn, $sc){
    /**
        Teniendo las relaciones que has comentado
        15º  = 60*60 sec
        15'  = 60 sec
        15'' = 1 sec
        
        Calculamos los tiempos en segundo de cada medida
    **/
    $gradSec = floor(($gr/15)*(60*60));
    $minSec = floor(($mn/15)*60);
    $secSec = floor($sc/15);
    
    //Sumamos todos los segundos    
    $tiempo = $gradSec+$minSec+$secSec;
}

Ahora creemos una función que nos ayude a pasar los segundos a horas y minutos
La tienes explicada en este tuto que hice ante ayer.
Crear multiples temporizadores con jquery

Código PHP :

function division ($dividendo, $divisor) {
    return array(
        floor($dividendo/$divisor),
        floor($dividendo%$divisor)
    );
}

Y ahora teniendo esta función sólo nos queda calcular el tiempo, retomamos la función calcularhora

Código PHP :

function calcularhora ($grados, $minutos, $segundos){
    [...]

    //Para hallar las horas, dividimos por (60secs*60min)
    $horasDiv = division($tiempo, (60*60));
    //Para los minutos el resto de las horas dividido entre 60
    $minutosDiv = division($horasDiv[1], 60);
    
    //Ahora extraemos todos los valores de nuestros arrays
    $horas = $horasDiv[0];
    $minutos = $minutosDiv[0];
    $segundos = $minutosDiv[1];
    
    //Y los devolvemos como un nuevo array
    return array($horas, $minutos, $segundos);
    
    //O los devolvemos directamente
    return array($horasDiv[0], $minutosDiv[0], $minutosDiv[1]);
}

Vale veámoslo completo y hagamos una prueba

Código PHP :

function calcularhora ($gr, $mn, $sc){
    $gradSec = floor(($gr/15)*(60*60));
    $minSec = floor(($mn/15)*60);
    $secSec = floor($sc/15);
    
    $tiempo = $gradSec+$minSec+$secSec;
    
    $horasDiv = division($tiempo, (60*60));
    $minutosDiv = division($horasDiv[1], 60);
    
    return array($horasDiv[0], $minutosDiv[0], $minutosDiv[1]);
}

function division ($dividendo, $divisor) {
    return array(
        floor($dividendo/$divisor),
        floor($dividendo%$divisor)
    );
}

Probemos con tu ejemplo y con uno mayor:

Código PHP :

$tiempo1 = calcularhora(8, 30, 15);

echo '$tiempo1 = calcularhora(8, 30, 15);'.'<br>';
echo $tiempo1[0].' horas'.'<br>';
echo $tiempo1[1].' minutos'.'<br>';
echo $tiempo1[2].' segundos'.'<br>'.'<br>';

$tiempo2 = calcularhora(45, 55, 35);

echo '$tiempo2 = calcularhora(45, 55, 35);'.'<br>';
echo $tiempo2[0].' horas'.'<br>';
echo $tiempo2[1].' minutos'.'<br>';
echo $tiempo2[2].' segundos'.'<br>';

/** ECHO
    $tiempo1 = calcularhora(8, 30, 15);
    0 horas
    34 minutos
    1 segundos
    
    $tiempo2 = calcularhora(45, 55, 35);
    3 horas
    3 minutos
    42 segundos
**/

Espero haberte ayudado,
Un saludo!

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 01 Mar 2013 10:44 am
Se me olvidaba lo más importante, y si quisieras sumar y restar coordenadas, modificas un pelín las funciones

Código PHP :

function calcularSegundos ($gr, $mn, $sc){
    $gradSec = floor(($gr/15)*(60*60));
    $minSec = floor(($mn/15)*60);
    $secSec = floor($sc/15);
    
    $tiempo = $gradSec+$minSec+$secSec;
       
    return $tiempo;
}

function calcularhora ($tiempo){    
    $horasDiv = division($tiempo, (60*60));
    $minutosDiv = division($horasDiv[1], 60);
    
    return array($horasDiv[0], $minutosDiv[0], $minutosDiv[1]);
}

function division ($dividendo, $divisor) {
    return array(
        floor($dividendo/$divisor),
        floor($dividendo%$divisor)
    );
}

Por ejemplo

Código PHP :

//Sumar:
calcularhora(
    calcularsegundos(58,15,3)
    +caclularsegundos(15,15,15)
);

//o restar:
calcularhora(
    intval(
        calcularsegundos(58,15,3)
        -caclularsegundos(15,15,15)
    )
);

Un saludo!

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 01 Mar 2013 05:38 pm
Uf decir que me has ayudado es poco amigo! Lo acabo de probar y es perfecto! Las medidas en efecto son las que comento arriba y el tema es el siguiente. Se trata de una pequeña ecuación astrologica.

Lo que hace es medir grados de arco o sea: los 15º son divisiones que tiene establecidas el globo terraqueo (circunferencia de 360º) por las cuales pasa el sol. Y los demás planetas se desplazan por estos arcos o gajos. La forma de medir las distancias es con los grados de arco que te comento.

Dado que en este caso se trata de un programa astrologico este código sirve para que yo tome la longitud de un lugar x y la convierta a tiempo de reloj nuestro.

Te estoy muy agradecido y ya mismo estoy estudiando detenidamente el mismo y mirando ese tutorial de temporizadores que me comentas!

Pero dejo constancia que funciona y soluciona el problema.

Saludos cordiales!

Por lordoracle

Claber

430 de clabLevel

5 tutoriales

 

I am a Wordpress Guy

chrome
Citar            
MensajeEscrito el 01 Mar 2013 06:56 pm
Me alegro mucho.
Un saludo!

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

safari

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.