miércoles, 17 de junio de 2015

Conversión de ficheros Kml III.

Definitivamente cada vez que abro un  fichero kml me encuentro con una estructura cada vez mas compleja, pero que a su vez facilita su conversión a otros formatos de ficheros con caminos o rutas de gps.

  • La última versión que me he encontrado de un fichero kml proviene de OruxMap, GPS para teléfono listillo.
  • Copio el fichero kml como texto. Trabajo con la copia TXT.
  • En las anteriores entradas dedicadas a la conversión de ficheros kml utilizaba las coordenadas incluidas entre las etiquetas <coordinates> y </coordinates>.  Esto sigue valiendo pero, en este caso, voy a utilizar las otras coordenadas etiquetadas con <gx:Track> y  <gx:coord>
  • En versiones anteriores las coordenadas estaban separadas por un espacio, sin salto de línea, lo que obligaba a incluirlo con el editor de textos. En este caso, los parámetros de cada punto están separados por una coma (-2.6815071,42.1721668,1078.60)
  • En este fichero kml proveniente de OruxMap nos encontramos con que las coordenadas aparecen dos veces, una entre las etiquetas <coordinates> y </coordinates> y, para mi, la nueva inclusión entre las etiquetas <gx:Track> y </gx:Track>. Este fichero incluye un apartado con la fecha-hora de cada punto Este fichero si incluye los satos de línea.
  • A su vez cada coordenada esta entre las etiquetas <gx:coord> y </gx:coord>. Los parámetros, en este caso, están separados por un espacio.
  • La fecha y hora de cada punto aparecen entre las etiquetas <when></when>.
  • Si el fichero no ha sido manipulado y los saltos de línea están donde deben estar la conversión a otros formatos es muy sencilla. Si estuviese manipulado, creando saltos de línea arbitrarios, habría que eliminar todos los saltos de línea para volver a incluirlos, de manera similar a lo explicado en la entrada anterior.
  • Para pasar los puntos a excel solo hay que copiar y pegar. 
  • Copiamos todas las líneas <gx:coord>-2.6742951 42.1623423 1091.10</gx:coord> en la columna A de una hoja excel. Preferiblemente, en este paso, no separamos los distintos parámetros.
  • Copiamos todas las líneas <when>2015-05-30T12:35:38Z</when> en la columna A de la hoja2, Preferiblemente, en este paso, no separamos los distintos parámetros.
  • Con editar->reemplazar eliminamos las etiquetas. <when>,</when>,<gx:coord> y </gx:coord> por espacio o por carácter nulo.
  • Eliminadas las etiquetas <when> y </when> de la columna A de la hoja2 copiamos la columna A de la hoja2 en la B de la hoja2.
  • En la columna B de la hoja2  (solo en la B) reemplazamos Z por nulo y T por espacio.
  • En c1 ponemos =SUSTITUIR(B1;",";"."). Arrastramos la fórmula hasta el final. Con esto tenemos la fecha en tres formatos.
  • En la hoja1 pasamos, con datos a columnas, la columna A.
  • Pasamos todos los campos como texto.
  • Después de pasar los datos de texto a columna nos queda la longitud en la columna A, latitud en la B y la altura en la C.
  • Copiamos o vinculamos en D la fecha que mas nos convenga para la conversión que queramos hacer. 
  • Concatenamos latitud, longitud, altura y fecha según el tipo de conversión. Como referencia, libro excel y formulas utilizadas la entrada anterior a esta de este blog.



jueves, 4 de junio de 2015

Conversión de un fichero GPX a formato PLT y otros formatos.

Libro excel
Tengo una entrada anterior dedicada a este tema. Reconozco que es una forma muy barroca de resolver algo que se puede resolver  mejor y mucho mas fácilmente. 
Lo mas complicado de la conversión de un fichero GPX a otro formato es pasar todos los parámetros de cada uno de los puntos a una sola línea, con el añadido de que si se ha manipulado el fichero los saltos de línea pueden estar en cualquier sitio. Aunque este tipo de conversiones es mucho mas fácil hacerlas programando  he trabajado este tipo de conversiones para hacerlas sin programación. He conseguido hacerlo de dos maneras, ambas son fáciles de hacer pero ambas son un poco complicadas de explicar. ¡Espero acertar!

Primera y, quizás, mas sencilla:
  • Preparamos un fichero GPX solo con un track, sin rutas ni waypoints. De momento solo garantizo el resultado utilizando un datum WGS84.
  • Copiamos el fichero GPX a un fichero de texto (TXT). Al finalizar cambiaremos el .txt por .htm.
  • Editamos con un editor de textos (bloc de notas).
  • Como el resultado final va a ser un fichero HTM (página web) debemos prescindir de los delimitadores de etiquetas HTML (<>). En este caso no voy a necesitarlos de nuevo pero si alguien desea recuperarlos después puede reemplazarlos por un MayorQue o un MenorQue y luego hacer la operación inversa.
  • Los parametros de los puntos de un track, en cualquiera de los formatos, son latitud, longitud, altura y fecha con hora del momento en que se tomó. Estos dos últimos parámetros pueden ser opcionales.
  • Como en un paso posterior en Excel voy a pasar el texto a columnas elijo como separador la coma (,). 
  • Reemplazamos < por el signo coma (,)
  • Reemplazamos > por el signo coma (,)
  • Reemplazamos " (comillas) por el signo coma (,)
  • Reemplazamos ,trkpt por <br>,trkpt
  • En este punto podemos reemplazar trkpt, lat=, lon=, ele, time y / por un espacio o bien eliminarlos como parte del trabajo en excel.
  • Salvamos y guardamos el fichero como .htm
  • Hacemos un doble click sobre este fichero. Si hay muchos puntos puede tardar mucho en abrirse.
  • La primera línea que se ve es la cabecera del fichero. A continuación deben deben aparecer como n líneas con los datos de los puntos del track :
trkpt lat=,42.17672892, lon=,42.17672892, ,ele,1065,/ele, ,time,2009-1-17T09:01:37Z,/time,/trkpt,


Abrimos un libro excel, en la página htm seleccionamos las todas líneas de los puntos, copiamos y pegamos en el libro Excel, normalmente en la casilla A1. Si hemos copiado la cabecera la eliminamos del libro excel.

Ya con el libro Excel:
  • Seleccionamos la columna con las líneas copiadas.
  • En Datos buscamos Texto en columnas.
  • Indicamos que es un texto delimitado. Marcamos la casilla "coma".
  • Importamos todos los campos como texto, si los importamos como general nos darán problemas. En este punto podemos desechar los literales y otros campos inútiles. 
  • Una vez pasado el texto a columnas, dependiendo de la conversión que vayamos a hacer, hay que pasar la altura de metros a pies y trabajar el formato de la fecha.
  • La fecha de los ficheros GPX tiene el formato 2009-1-17T09:01:37Z. Eliminamos la T y Z y lo convertimos a número con =SUSTITUIR(SUSTITUIR($I1;"T";" ");"Z";"")+0. Cambiamos la coma por punto con =SUSTITUIR(L1;",";".").
  • La altura del punto para pasarlas de metros a pies la dividimos por 0,32. Sustituimos la como por un punto con =SUSTITUIR(N1;",";".")
  • Cada línea de puntos de un fichero plt esta compuesta por Latitud,Longitud ,0, Altura, Fecha en número, fecha en formato fecha.
Cabera de un fichero PLT:

En oziExplorer creamos un fichero de track (plt) con un par de puntos. Abrimos ese fichero con el editor de textos, borramos los puntos que hemos utilizado para simular un track y añadimos, mediante un copia-pega los puntos procedentes del fichero GPX.
Salvamos y probamos.

OziExplorer Track Point File Version 2.1
WGS 84
Altitude is in Feet
Reserved 3
0,5,255,19/05/2015 14:25:33                ,0,0,0,2951611,-1,0
1454 Sustituir, aunque no es necesario, por el número de líneas.
41.889032,-8.849871 ,0, 3, 41039.3403935185,05-10-2012 08:10:10

Segundo método:

Aquí la cuestión, como ya he dicho, consiste en situar en una sola línea todos los parámetros de un punto. El método que utilizo para conseguir esta alineación es, primero, eliminar los satos de línea para después añadirlos antes del primer parámetro del punto.

Tengo dos s.o. WXP y Guadalinex. En WXP la sustitución de los satos de línea se puede hacer con el block de notas (noteppad), y en Guadalinex se puede hacer, mucho mas sencillo con el editor de textos GEDIT. GEDIT también tiene una versión, gratuita, para windows.

******************************************************

  • He cambiado de sistema a Windows7. Este cambio, además de S.O. supone un cambio de máquina (de 32 bits a 64) que ha dejado inútil mi colección de programas, casi ninguno me vale ya. De todas maneras es un cambio que, en algún momento, hay que hacer.
  • En cuanto a los saltos de línea, los primeros pasos parecen indicar que, a veces, lo que funcionaba en WXP no funciona en Windows7.
  • A fecha de hoy (31/05/2016). Seguiré probando y si encuentro solución ya la subiré.
  • En un primer intento quiero convertir un fichero GPX  que  he tratado con un programa bajo  W7.
  • De momento, si el fichero GPX está tal y como lo bajas del GPS, parece que sigue funcionando como en WXp.
Solución encontrada (2/6/2016):
  • Sigo sin saber que carácter se me ha colado en el fichero. Intuyo que es algún código no ASCII, quizás UNICODE u otro.
  • Abro con GEDIT el fichero en cuestión. Selecciono el texto que me interese convertir.
  • Lo copio en una hoja excel (A1).
  • Después del copia pega cada línea debe quedar en una sola  celda.
  • En otra columna (B, celda B1) pongo la siguiente fórmula: =LIMPIAR(ESPACIOS(A1)). La función LIMPIAR elimina los caracteres no imprimibles. 
  • Arrastro la formula hasta el final.
  • Copio la columna B.
  • Abro en GEDIT un documento nuevo.
  • Pego la columna copiada.
  • Elimino los saltos de línea tal y como se explica a continuación.
  • Coloco un salto de línea a principio de cada punto.

******************************************************
Con GEDIT:
  • Copiamos el fichero GPX como fichero de texto. Lo abrimos con GEDIT. Para GEDIT el salto de línea es \n.
  • Eliminamos los saltos de línea con GEDIT. Reemplazamos \n por un espacio o un carácter nulo. 
  • Eliminamos los retornos de carro con GEDIT. Reemplazamos \r por un espacio o un carácter nulo. 
  • Reemplazamos <trkpt por \n<trkpt. Esto sitúa un salto de línea antes del inicio de cada punto.
  • Hacemos el resto de las sustituciones del primer método.
  • Salvamos como TXT y abrimos el fichero con excel.
  • Pasamos los datos a columnas, eliminamos literales, preparamos fecha y altura y continuamos como en el primer punto.
Con block de notas (notepad):

Si el fichero GPX no ha sido manipulado entre los caracteres visibles aparece un cuadradito. Este "cuadradito" es un salto de línea. Lo copiamos, elegimos reemplazar y pegamos el cuadradito en reemplazar y lo reemplazamos por un espacio o un carácter nulo. Reemplazamos <trkpt por cuadradito<trkpt. Continuamos como en el método anterior.
Si el fichero GPX ha sido manipulado el cuadradito ya no aparece. En este caso abrimos excel, escribimos en cualquier celda =caracter(10) y nos debe aparecer el cuadradito. Sustituimos según el paso anterior y continuamos según lo explicado.

** Válido para WXP. Los windows mas modernos parece que no se comportan igual.











viernes, 22 de mayo de 2015

Conversión de TRK a GPX.



El otro día me encontré con que una página web permitía descargar un fichero para GPS en formato TRK, vía romana del Iregua. Otro tipo mas de colocar los tres o cuatro valores de los puntos de una ruta en un fichero. El fichero TRK comienza con una cabecera a continuación de cual hay una línea por punto.
Estructura de la línea de puntos:
T  A 42.17672892ºN 2.70418888ºW 17-JAN-09 09:01:37.000 s 1065.300049 0.000000 0.000000 0.000000 0 -1000.000000 -1.000000 -1 -1.000000 510
Los valores que nos interesan son :
  • Columna 3: Latitud.
  • Columna 4: Norte o sur.
  • Columna 5: Longitud.
  • Columna 6, Este (E) u oeste (W)
  • Columna 7, Día de la fecha, en ingles.
  • Columna 8, Hora del día.
  • Columna 10, Altitud, en metros.
Proceso de conversión:

  • Abrimos con el editor de texto el fichero TRK. En realidad,como siempre, aunque e puede trabajar directamente con el fichero original lo suyo e copiar el fichero TRK a un fichero TXT y trabajar con este último.
  • Seleccionamos y copiamos las líneas de los puntos. Como hay un carácter un poco problemático de usar en Excel, el signo de grado (º), resulta mas cómodo eliminarlo con el editor de textos, sustituyendolo por un espacio.
  • La hora viene con unos decimales al final (09:01:37.000). Esto decimales (.000) no se deben sustituir con el editor, estos caracteres se pueden dar en otros campos.
  • En un libro excel abierto pegamos las líneas a copiar.
  • Seleccionamos la columna recién pegada.
  • Buscamos en cualquiera de las líneas el carácter "º".  Esto no sería necesario si lo hemos sustituido anteriormente por un espacio.
  • Lo seleccionamos y copiamos.
  • En excel vamos a Datos->Texto en columnas. Seleccionamos delimitados. Seleccionamos como delimitadores espacio y otro. En el recuadro de otro pegamos el carácter "º".
  • Seleccionamos las diez primeras columnas y las importamos como texto, no como general, es importante.
  • Desechamos el resto de las columnas. Nos quedan n líneas de como la de abajo.

T A 42.17672892 N 2.70418888 W 17-JAN-0909:01:37.000 s 1065.300049










  • Sustituimos, con Editar->Reemplazar la fecha, en este caso 17-JAN-09, por una fecha con nuestro formato habitual (17/01/2009) . En este caso he reemplazado Jan por 01. Este cambio también se puede hacer con el editor de textos. 
  • Completamos la transformación de la fecha en las columnas N y M. Si la fecha del día está en la columna G escribimos en M la siguiente formula =IZQUIERDA(H1;8)+G1. 
  • En N escribimos =SUSTITUIR(M1;",";"."). Con esto tenemos la fecha convertida a un número en formato anglosajón, punto por coma.
  • Si el punto es oeste (W) debe aparecer la longitud con signo negativo. Lo mismo si el punto fuese un punto sur la latitud sería negativa. Para calcular estos signos escribo en K =SI($D1="N";"";"-") y escribo en L =SI($F1="E";"";"-"). Este cambio se puede hacer con el editor de textos, cambiando ºN por un espacio, ºS por un " -", ºW por " -" y ºE por un espacio.
  • En O ponemos la siguiente fórmula:="<trkpt lat="&CARACTER(34)&K1&C1&CARACTER(34)&" lon="&CARACTER(34)&L1&E1&CARACTER(34)&" >"
  • En P ="<ele>"&J1&"</ele>".
  • En Q ="<time>"&TEXTO(M1;"aaaa-mm-ddTHH:MM:SSZ")&"</time>"
  • Y por último en en R =O1&P1&Q1&"</trkpt>"
  • Arrastramos, llevado las formulas a todas las líneas.
  • Abrimos MapSource. Nos aseguramos de estar trabajando con el mismo  datum que el del fichero TRK. Lo ideal es trabajar en ambos ficheros con el datum  WGS84.
  •  Creamos MANUALMENTE un track ,con un par de puntos vale. Lo salvamos como GPX.
  • Editamos con el editor de textos ese fichero. Buscamos los puntos creados manualmente. Están limitados por un <trkseg> y un </trkseg>:
  •     <trkseg>
  •       <trkpt lat="40.5514303" lon="-4.0899551">
  •         <ele>845.8554688</ele>
  •       </trkpt>
  •       <trkpt lat="40.4400392" lon="-3.8991790">
  •         <ele>724.9843750</ele>
  •       </trkpt>
  •     </trkseg>
  • Mantenemos  <trkseg> y el </trkseg> y borramos los puntos.
  • Copiamos la columna R del libro excel entre <trkseg> y el </trkseg>
  • Salvamos y comprobamos que todo ha salido bien.
  • Completamos nuestro trabajo con MapSource.











martes, 3 de febrero de 2015

Función Arco Coseno para VBasic

O como complicarse la vida inútilmente, con lo sencillo que resulta. 
Necesito obtener el arco coseno de un valor para procesarlo en VBasic para excel. VBasic no tiene una que lo permita, tampoco tiene la función arco seno, solo tiene arco tangente.
Tiro de mi casi del todo olvidada base matemática y decido generar una función arco coseno (MiACos(R)) en base al desarrollo en serie de dicha función. Encuentro en internet dos desarrollos, uno de los cuales directamente no entiendo, y con el otro empiezo el desarrollo (no pongo la fórmula de la serie.) Funcionar, funciona, pero solo para ángulos con un valor superior a 15 grados. Para valores inferiores, si intento apurar el número de términos sumados se produce un desbordamiento y no puedo aumentar la resolución.
Estuve dos días dedicado a simplificar las respectivas multiplicaciones y llego a la siguiente función:


Function MiACos4(R)

Dim Pi, DosNMas1, FactN, Fact2N, X, M, CuatroN
Pi = 3.141592654
M = Pi / 2
For N = 0 To 2506
DosNMas1 = 2 * N + 1
F = 1 / (DosNMas1)
For I = 1 To N
X = (N + I) / I
F = F * X / 4
Next


M = M - F * (R ^ DosNMas1) '



Next



MiACos4 = M


End Function


No la explico, funciona entre 5 y 90 º, pero la desecho. No lleva a ningún sitio.



Pienso y me digo, VBasic tiene la función Atn(r), arco tangente en radianes. Y si conozco el coseno, conozco el seno  (sen^2+cos^2=1) y si conozco seno y coseno conozco la tangente. A partir de este supuesto creo la siguiente función, sin complicarme la vida:



Function MiACos5(R)

Dim S, C, T
C = R
S = Sqr((1 - R ^ 2))
T = S / C


MiACos5 = Atn(T)


End Function


Como podéis ver no he contemplado la posible división por cero, lo dejo en manos de quien quiera utilizarla.




martes, 27 de enero de 2015

No consigo convertir texto a número

¿Que me pasa?¿Que estoy haciendo mal?¿Por qué? ¿Que leches pasa? No me funciona, etc...

Suelo salir a la montaña con mi GPS. Después de una ruta montañera paso al ordenador la ruta, con MapSource, y hago mis propias estadísticas. Últimamente además de subir las rutas a Wikiloc las subo a http://www.ibpindex.com/, que tiene unas estadísticas mas completas. Para comparar ambas estadísticas quiero pasar los datos de IBPINDEX a un libro excel para comparar comodamente estadísticas y lo bajado de la web. Teoricamente todo fácil, pero, siempre hay un pero, no consigo convertir los valores de texto a valor numerico.

  1. Como siempre que me pasan estas cosas, encorseto entre asteriscos el valor a trasformar, con ="*"& C1 &"*".
  2. Efectivamente aparece un carácter por delante del número. De momento parece un espacio.
  3. Con ctrl+l o entrando en Edición->reemplazar intento eliminar ese espacio. Pongo un espacio en Buscar y nada en reemplazar, doy reemplazar todo y nada, no consigo mi objetivo. 
  4. Sigo en reemplazar, copio ese carácter desconocido en la casilla Buscar y dejo sin nada en reemplazar y ¡por fin! consigo algo.
  5. Como excel es como es, corrijo un error pero se produce otro. Me trasforma  40.5750652 en  405750652.
  6. Deshago la primera operación, reemplazo los "." por comas y el carácter desconocido por un caracter nulo ("").
  7. Por fin consigo trasformar a número el texto.
  8. Continuo indagando, separo ese carácter, en la celda B1, con =IZQUIERDA(A1;1), aunque para lo que voy a hacer a continuación no es del todo necesario.
  9. Utilizo =CODIGO(b1) para intentar conocer el carácter ignoto. ¡Bingo! el carácter es el ASCII 160, que a su vez equivale al  &nbsp del código Html.

En este caso, la manera mas sencilla de trasformar los valores en texto a valor númerico es reemplazar todos los puntos por comas y todos los ASCII 160 por nada o por un espacio de barra espaciadora (ASCII 32). Hay otras opciones para eliminar esos primeros caracteres (contemplado además  el cambio de punto por coma), como por ejemplo utilizar Datos->Texto en columnas pero creo que la manera mas sencilla es reemplazar esos caracteres, según lo dicho.

¿Como importo una página web a Excel?:

  • Con copia pega.
  • En, para windows XP, Inicio->Ejecutar escribimos: excel -e http://www.ibpindex.com/ibpindex/ibp_listadepuntos.php?REF=36314455664614&MOD=HKG&LAN=es&SMD=m
  • Desde Excel: Archivo->Abrir y ponemos l dirección (URL) en nombre de archivo.

viernes, 28 de noviembre de 2014

Eje de tiempos

Esta vez estaba realizando un gráfico XY en el que el eje X es una distancia acumulada, en metros, y el eje Y es un acumulado de tiempos. La gráfica es un "cuanto tiempo tardo en andar..."

El eje y, al realizar la gráfica, si que presenta un formato de tiempos pero la escala presenta unos números que no cuadran con lo que esperaríamos de un eje de tiempos.



Lo que yo espero de un eje de tiempos es que la escala pase por el minuto 0 de cada hora y, aquí ya depende de cada cual, cada cinco minutos o cada diez minutos o cada cuarto de hora o cada ... aparezca en la escala del eje.

Antes de modificar los valores de la escala del eje Y debemos conocer algunos valores, el valor numérico de una hora. En este caso utilizo una escala de 15 minutos y una subescala de 5 minutos. Escribo 00:05:00 en una celda, en otra celda copio y doy formato numérico al valor. Repito la operación para el cuarto de hora y para el valor máximo al que queremos llegar. 

En el formato del eje Y de la gráfica, opción escala, pongo los valores NUMÉRICOS de cinco minutos, del cuarto de hora y del valor máximo al que queremos llegar.




viernes, 14 de noviembre de 2014

Kilos y tallas.

¿Cuantos kilos debo perder para volver a entrar en la talla 40? 
Ejercicio, perfectamente inútil, que calcula los kilos que hay que perder, o ganar, para alcanzar una determinada talla partiendo, lógicamente, de otra. Como ya he dicho es un ejercicio perfectamente inútil para conseguir un peso determinado, es un ejercicio para manejar variables con nombre en Excel. Algunos cálculos se hacen directamente al definir la variable y no en una celda. 

Variables definidas:
  • Ajuste Objetivo.$E$2
  • KPer   Objetivo.$C$2. Kilos a perder
  • PIni    Objetivo.$B$1. Peso inicial
  • R_1    TIni/PI(). Radio inicial.
  • R_2    TFin/PI(). Radio final.
  • S_1     PI()*R_1^2 Superficie proporcional a R1 cuadrado.
  • S_2     PI()*R_2^2 Superficie proporcional a R2 cuadrado.
  • TFin   Objetivo.$B$3. Talla final.
  • TIni    Objetivo.$B$2. Talla inicial.
  • K_P    Ajuste*PIni*(S_1-S_2)/S_1. Kilos a perder calculado en la propia variable.
Todas estas variables se pueden utilizar directamente en las celdas,   poniendo = variable (por ejemplo =K_P)
  • Supongo que el peso final es proporcional a la talla del pantalón. 
  • A su vez supongo que puedo proyectar el cuerpo humano como un cilindro de altura constante y que varia de radio. 
  • El volumen, y por tanto el peso, depende de la superficie que nos de el radio del cilindro. En este punto supongo la talla como un circulo de talla/2 cm. A partir de ese supuesto calculo el radio, a partir del radio calculo la superficie del circulo y conocidas las dos superficies hago un calculo proporcional de perdidas o ganancias de peso.
  • En un último momento añadí la variable "Ajuste" con el fin de que los valores por talla coincidieran con los pesos y tallas recordados. En mi caso coinciden.



miércoles, 24 de septiembre de 2014

Convertir fichero KML a PLT y GPX II

https://drive.google.com/file/d/0B0wjloS-L7fxbzBnQ2RMZlcxNUU
Hasta el momento, lo que he logrado ver, es que las coordenadas en un fichero kml  son una serie de ternas de números (-6.0906000,43.0571700,1200) separadas por un espacio. Cada terna está formada por la longitud (-6.0906000), la latitud (43.0571700) y la altitud, separadas por comas, en una única línea. El principal problema a la hora de convertir esas coordenadas es que cada coordenada no está en una línea distinta, todas ellas están en la misma línea. Aunque oziexplorer permite abrir el fichero KML y salvarlo como PLT o como GPX, yo no conozco ninguna aplicación que trasforme el camino seguido a wpt o a ruta.
 He preparado tres métodos para introducir esos saltos de línea y un libro excel que convierte el formato kml a los formatos que utilizan Oziexplorer y Garmin (GPX).

  • Actualmente sigo utilizando windows XP y office 2003. Puede que con otra configuración los siguientes pasos funcionen de manera diferente, o no funciones.
  • Aunque hay varios editores de texto que pueden valernos, yo utilizo el que todos los usuarios de windows tenemos, el Bloc de notas (notepad). 
  • Utilizo excel, pero puede ser muy interesante tener instalado open office o libre office.
  • Abrimos con el bloc de notas el fichero kml. Buscamos, estan al final, la línea con las coordenadas. Nos quedamos solo con las coordenadas. Salvamos como texto.
  • Abrimos un libro excel en blanco, escribimos, en cualquier celda =caracter(10). Nos sale un carácter inidentificable.
  • En el bloc de notas de las coordenadas elegimos Edición->Reemplazar. Buscamos los espacios en blanco, un golpe al espaciador. En reemplazar ponemos el carácter 10, para ello vamos a la celda en donde hemos escrito =caracter(10), copiamos y situados en Reemplazar pegamos ese valor con ctrl+V. Si además de el carácter 10 aparecen unas comillas, las eliminamos. Reemplazamos todo.
  • Guardamos como TXT. 
  • Abrimos ese fichero con excel, bien desde el propio excel, bien mediante el botón derecho del ratón con "Abrir con" y seleccionando excel.

Segundo método: 

  • Nos quedamos solo con las coordenadas.
  • Reemplazamos los espacios por "<br>".
  • Salvamos como HTM.
  • Damos un doble click sobre el fichero. Se abre con el explorador.
  • Copiamos del explorador a excel.
Tercer método:

  • Consiste en crear una tabla HTM.
  • Nos quedamos solo con las coordenadas.
  • Trasformamos esa línea en una tabla HTM. Pra ello:
  • Reemplazamos los espacios en blanco por </tr><tr><td>
  • Antes de las coordenadas escribimos <table><tr><td>
  • Después de las coordenadas escribimos </table>
  • Guardamos como HTM
  • Abrimos ese fichero con excel, bien desde el propio excel, bien mediante el botón derecho del ratón con "Abrir con" y seleccionando excel.
  • Las coordenadas ocupan una sola columna. Para pasarlas a varias columnas utilizo, seleccionando toda la columna, Datos->Texto en Columnas. Indicamos que la coma funciona como separador y que todos los campos son campos de texto. Procedemos.
  • Los distintos formatos, tanto el de Oziexplorer como el de Garmin, son sencillos, no necesitan grandes explicaciones. Concatenando textos llegamos a ellos (columnas de la E a la H de la hoja Kml-Plt1)
  • En este caso utilizo tres variables con nombre, Comillas = Caracter(34), NL (nueva línea) =Caracter(10) y PaM, factor conversión, de metros a pies, 3,3333333
  • de Kml a PLT (Ozi): =$C2&","&$B2&",0,"&ENTERO($D2*PaM)
  • De Kml a Wpt (Ozi): =$F2&",P"&$F2&","&$C2&","&$B2&",,"&$D2&",,,,,,,"&",P"&$F2&",,,,"&ENTERO($D2*PaM)
  • De Kml a ruta GPX: ="<rtept lat="&Comillas&$C2&Comillas&" lon="&Comillas&$B2&Comillas&">"&NL&"<ele>"&$D2&"</ele>"&NL&" <sym>Waypoint</sym>"&NL&"</rtept>"
  • De Kml a wpt GPX: ="<wpt lat="&Comillas&$C2&Comillas&" lon="&Comillas&$B2&Comillas&">"&NL&"<ele>"&$D2&"</ele>"&NL&" <sym>Waypoint</sym>"&NL&"</wpt>"
  • Arrastramos y completamos todas las coordenadas.
  • Ponemos, tanto en Oziexplorer como en MapSource, el datum a WGS84.
  • Creamos y salvamos, en Oziexplorer, un fichero plt (track) y un fichero wpt.
  • Creamos y salvamos un fichero con un par de puntos para los wpt y un fichero con una ruta con esos dos puntos en MapSource. Salvamos como GPX.
  • Editamos, se puede utilizar cualquier editor de textos, el fichero plt. Borramos los puntos del camino (son muy fáciles de identificar, están al final). Copiamos los puntos creados en el fichero excel, columna E (sin la cabecera, a partir de E2). Los pegamos en el fichero PLT y salvamos. Comprobamos, con ozi, que funcionan.
  • Editamos, se puede utilizar cualquier editor de textos, el fichero wpt. Borramos los puntos (son muy fáciles de identificar, están al final). Copiamos los puntos creados en el fichero excel, columna G (sin la cabecera, a partir de G2). Los pegamos en el fichero wpt y salvamos. Comprobamos, con ozi, que funcionan.
  • Por lo que yo he visto oziexplorer es muy flexible con los errores pero MapSource es todo lo contrario, es muy poco flexible, rechaza el mas mínimo error. Hay que tener mucho cuidado al editar un fichero GPX.
  • En los ficheros GPX eliminamos los wpt y los puntos de la ruta y los sustituimos por las valores calculados en la columna H para la ruta y la columna I para los wpt.
  • Los wpt están al principio, no están incluidos entre etiquetas y con los datos que les pasamos basta. <wpt lat="42.9791983" lon="-6.1071474"><ele>1200</ele><sym>Waypoint</sym></wpt>
  • Las rutas están incluidas entre las etiquetas <rte> y </rte>, sustituimos los puntos por los creados, columna H (sin la cabecera, nos daría un error) <rtept lat="42.9791983" lon="-6.1071474"><ele>1200</ele><sym>Waypoint</sym></rtept>


Conversión de De PLT a GPX
Conversión de GPX a PLT
http://ellibrosobreexcelquenoescribirenunca.blogspot.com.es/2011/11/de-gpx-plt.html
http://ellibrosobreexcelquenoescribirenunca.blogspot.com.es/2011/11/de-gpx-plt-ii.html
http://ellibrosobreexcelquenoescribirenunca.blogspot.com.es/2011/11/de-gpx-plt-iii.html











      viernes, 5 de septiembre de 2014

      Cálculo del area de un polígono irregular

      Libro Excel

      Este libro excel, hay que descargarlo, permite calcular el área de un polígono irregular mediante el método de dividirlo en triángulos. El área de cada triángulo la calculo utilizando el teorema del coseno para calcular la altura del triángulo. De momento no presenta la gráfica del polígono, solo calcula el área.

      • Calculo el ángulo, en radianes con :=(ACOS((A3*A3+B3*B3-C3*C3)/(2*A3*B3)))
      • La altura se calcula con =A3*SENO(D3).
      • El área resultante de cada triángulo es =($H3*$B3)/2



      ¿Como utilizar el libro?


      • Dibujamos a mano alzada la parcela, mas o menos con la forma real de la parcela. 
      • Sobre el plano dividimos en triángulos.
      • Si es preciso colocamos en el terreno señales desde  donde y hasta donde medir.
      • Después de esta división en triángulos se mide, sobre el terreno, los tres lados de cada triángulo. 
      • Esos valores los llevamos a la hoja excel, solo hay una en el libro, columnas D1,L y D2. Automáticamente sale el área del triangulo en la columna I. 
      • Se necesita una fila por triangulo. 
      • Si fuese necesario habría que repetir o arrastrar la fila 3 hasta completar o igualar el número de  filas con el número de triángulos.
      • La suma de áreas está en I1. Suma desde I3 a I22. Como es lógico se debe adaptar a cada necesidad.

      lunes, 1 de septiembre de 2014

      Área de un cuadrado irregular


      Libro excel
      El otro día nos surgió la necesidad de conocer el área de una parcela, una antigua era de un pueblo castellano. En una de las entradas anteriores de este blog explico como se puede medir una superficie situando dos focos y midiendo desde esos focos a los vértices. El método utilizado para medir la era es una versión reducida del anterior, solo hay que hacer cinco medidas, pero solo vale para cuadriláteros cuyas diagonales sean interiores (mas o menos con la forma del cuadrilátero inferior). Para cuadriláteros con diagonales externas el método vale pero el área de los dos triángulos formados se resta en vez de sumarse. Es como en mi entrada anterior dedicada a este tema es un método gráfico reconvertido a excel. Desde los extremos de la diagonal trazamos con un compás  las circunferencias de radio L2 y L3. La intersección de las circunferencias nos da el vértice superior. Si repetimos la operación para L1 y L4 obtenemos el vértice inferior.
       La diagonal está en este caso es el eje X, según el dibujo.
       Con un dibujo similar a este, dibujado a mano alzada, medimos, y anotamos los valores medidos, los cuatro lados y la diagonal. Llevamos los valores medidos a la hoja "Area". 
      Con esta posición se ve claramente que el cuadrilátero se puede dividir en dos triángulos de los que conocemos, o para ser exactos, podemos conocer todos los parámetros que nos dan su área. El área del triangulo superior es D*H1/2. El área del triangulo inferior es D*H2/2 (valor absoluto de H2, sin signo).El área del cuadrilátero es la suma del área de los dos triángulos, D*(H1+H2)/2. La cuestión ahora es cuanto valen, o como calculamos, H1 y H2. 

      Los valores H1 y H2 se pueden calcular aplicando el teorema del coseno o, como en este caso, utilizando la formula de la circunferencias con radio l2 y l3 (o l4 y l1). 
      • X^2+Y^2=L_2^2 =>Y^2=L_2^2-X^2
      • (X-D)^2+Y^2=L_3^2 =>Y^2=L_3^2-(X-D)^2
      • Como las Y son iguales: L_2^2-X^2=L_3^2-(X-D)^2
      • Despejando X_1=(D^2+L_2^2-L_3^2)/(2*D)
      • De manera similar: X_2=(D^2+L_1^2-L_4^2)/(2*D)
      • Llevando X_1 a la fórmula inicial calculamos Y, que es igual a H_1. Por tanto H_1=RAIZ((L_2^2-X_1^2))
      • De manera similar, H_2=-RAIZ(L_1^2-x_2^2), incluyendo el signo.
      Todo esto es, desde el punto de vista de las matemáticas,  o relativamente sencillo o relativamente complejo, según la soltura matemática de cada cual, pero hacerlo "a mano" siempre es un poco lioso, lo ideal es utilizar una hoja de cálculo, en este caso Excel.

      • Además de calcular las dimensiones, el área, de la parcela, roto y traslado la gráfica con el fin de que cada cual la pueda ver desde el punto de vista que prefiera.
      • La rotación consiste en dejar uno de los lados sobre el eje X.
      • Una vez conocidas las coordenadas de los vértices calcular el ángulo que forma un lado con el eje x es tan sencillo como dividir el incremento de y por el incremento de x entre los vértices de un lado. Esto nos da la tangente y con ATAN calculamos el ángulo en radianes (=ATAN(($F3-$F2)/($D3-$D2))
      • El nuevo valor de x, conocido el giro, es =D2*COS(Alfa)+F2*SENO(Alfa)
      • El de y es : =F2*COS(Alfa)-D2*SENO(Alfa)
      • Donde Alfa es el ángulo seleccionado por el desplegable.
      • Por último calculo los cuatro ángulos formados por los cuatro lados. Para el cálculo de los ángulos utilizo el teorema del coseno.




      Utilizo los siguientes variables y rangos con nombre:

      Alfa=Era!$G$8
      Alfas=Era!$G$2:$G$6
      Ang=Aux!$B$1:$B$5
      D=Era!$B$1
      Eje=Era!$G$7
      H_1=RAIZ((L_2^2-X_1^2))
      H_2=-RAIZ(L_1^2-x_2^2)
      L_1=Era!$B$2
      L_2=Era!$B$3
      L_3=Era!$B$4
      L_4=Era!$B$5
      MaxX=MAX(Era!$D$2:$D$6)
      MaxY=MAX(Era!$F$2:$F$6)
      X_1=(D^2+L_2^2-L_3^2)/(2*D)
      X_2=(D^2+L_1^2-L_4^2)/(2*D)


      El libro excel no está protegido ni explicado, si alguien quiere utilizarlo solamente, los datos, diagonal y lados , se escriben en la hoja "Area"  y directamente presenta el  resultado en esa misma hoja. La forma, aproximada, de la parcela está en el gráfico Plano(2). Esta hoja presenta un desplegable que permite seleccionar el eje que va sobre el eje x.



      martes, 8 de julio de 2014

      Controlar calefacción vía internet con Excel y RealTerm



      ¿Que hace un hombre de mi edad encendiendo y apagando lucecitas? No lo he hecho como me gustaría, lo haré, pero de momento consigo encender y apagar un led a distancia, vía internet.
      Utilizo RealTerm, estaba en otro tema cuando me encontré con RealTerm, Excel y Arduino. No buscaba controlar un apagado -encendido desde la red, estaba intentado hacer una gráfica en excel  con los datos leídos y pasados por Arduino.

      • En una entrada de mi blog dedicado a Excel pongo la lista de comandos a ejecutar, enmarcados por unas palabras clave, que me permite identificar claramente el área de comandos. Tan fácil como limitar este area con "Inicio lista de comandos" y "Fin lista de comandos"
      • Con el vbasic de Excel leo periodicamente esa entrada en mi blog.
      • RealTerm es un terminal serie que permite comunicar el ordenador con Arduino, es equivalente al monitor de Arduino.
      • Para comunicar Excel y Arduino hay que insertar un objeto en la programación VBasic que nos permita esa comunicación. RealTerm tiene en internet un ejemplo incompleto de como se inserta el objeto RealTerm. Dándole vueltas y echando un poco de imaginación terminé encontrado algunas sentencias, que no encontré en internet, que me permitieron automatizar esa comunicación.
      • En Arduino preparé un pequeño programa que lee la entrada serie y que, entre otras cosas, al reconocer el comando de encendido, enciende, y al reconocer el comando de apagado, apaga.
      • Resumiendo hay tres niveles de programación, VBasic propiamente dicho, inserción de RealTerm y lo que queramos que haga el microcontrlador.


      Inserción de RealTerm:

      Sub AbreRealterm()
      Dim Puerto, Baudios, Captura, Titulo, FicCap, FicEnvio
        Set RT = CreateObject("Realterm.RealtermIntf")

       With Sheets("Aux")
        Puerto = .Range("b3").Value
        Baudios = .Range("c3").Value
        Captura = .Range("d3").Value
        FicCap = .Range("e3").Value
        FicEnvio = .Range("f3").Value
      Titulo = .Range("g3").Value
        End With
        
        
        With RT
       ' .displayas = 1
        .HalfDuplex = True
        .Caption = Titulo ' "Realterm Controlado desde Excel"

        .port = Puerto
        .baud = Baudios
        .capture = Captura 'True
        .portopen = True
       ' .capture = False
        
      '.sendfile = "c:\temp\Envios.txt" ' False
      .capturefile = FicCap '"c:\temp\Captura.txt"

        
      '  .SelectTabSheet ("I2C")
        End With


        

      End Sub



      Sub RealtermVisible()
      Sheets("Inicio").Select
      ActiveSheet.Shapes("Button 7").Select
      If RT.Visible Then
          Selection.Characters.Text = "Ver Realterm"
          RT.Visible = False
          Else
            Selection.Characters.Text = "No Ver Realterm"
          RT.Visible = True
          End If
          ActiveSheet.Range("a1").Select
      End Sub


      Sub ActualizaTerminal()
      With RT
       ' .HalfDuplex = True
        '.Caption = "Realterm Controlado desde Excel"
        '.portopen = True
        '.port = 14
        '.baud = 9600
        '.capture = "file = c:\temp\xxxx.txt"
       ' .sendfile = "c:\temp\xxxx.txt" ' False
       ' .capturefile = "c:\temp\xxxx.txt"
       ' .ansi = True
       ' .SelectTabSheet ("I2C")
        
        .capture = False
       ' .capture = True
       .sendfile = "c:\temp\Envios.txt" ' False
       .capturefile = "c:\temp\Captura.txt"
       .terminal.Clear
      '.capturestart = 0
      '.alfduplex = True
        
        End With

      End Sub


      viernes, 13 de junio de 2014

      Valor que se ve y valor real en Excel

      Estaba esta mañana trasteando con Arduino en algo relativo a fechas cuando me acorde de un pequeño problema que tuvo una compañera, hace años, al contar duraciones. No le cuadraba, no contaba bien, una de las duraciones que debía estar incluida en un determinado apartado, no lo estaba. Profundizando vimos que lo que pasaba era que aunque en la celda aparecía un valor, el valor real era unas millonésimas menor. Por tanto no debía estar incluido en ese apartado. No recuerdo los valores, lógico, pero para reproducir el incidente:
      • En A1 pongo =30/(24*60)-0,00000000001.
      • En B1 pongo =A1, pero doy formato de hora, HH:MM. Da 00:30
      • En C1 pongo =MINUTO(A1). Da 30.
      • En D1 pongo =A1*24*60. Con formato número, sin decimales o con pocos decimales. Aparece 30. Todo indica que es un valor igual a 30.
      • En E1 pongo =D1=30. Da falso. Da que D1 no es igual a 30.
      • Modifico el formato de D1. Aumento el número de decimales hasta el máximo numero de decimales o hasta que se note la variación. Aparece 29,9999999856, que efectivamente no es 30.

      martes, 13 de mayo de 2014

      Reloj digital. Formato condicional.







      No hay reloj analógico sin reloj digital. Esta es una frase rotunda, en absoluto  cierta, pero ya que hice un reloj analógico puedo hacer uno digital. Incluyo el mismo código VBasic que utilice en el reloj analógico pero solamente para refrescar el dato.
      Esta vez el reloj se basa en la posibilidad de cambiar el formato de una celda en función del valor que contenga o de el valor que tome una determinada función. En una entrada anterior, Formato condicional, Emulación de un display, ya traté este tema. Este reloj digital no supone una gran diferencia con respecto a esa entrada, es una utilización práctica de la emulación del display. En vez de uno, seis.
      Modificando el ancho y el alto de filas y columnas emulo o doy forma a 6 displays. Cada segmento, en este caso los display tienen 13 en vez de los 7 que tiene el display de la entrada anterior. Como decía, cada segmento, "luce" o "no luce" en función del número a representar. Los números a representar son:
      • H0. Parte izquierda de la hora. Para obtener la hora utilizo, dentro de una variable con nombre (HH), la función Hora(ahora()).  
      • H_1. Parte derecha de la hora.
      • M0. Parte izquierda de los minutos. Para obtener los minutos utilizo, dentro de una variable con nombre (MM), la función MINUTO(AHORA())   
      • M_1. Parte derecha de los minutos.
      • S0. Parte izquierda de los segundos. Para obtener los segundos utilizo, dentro de una variable con nombre (MM), la función SEGUNDO(AHORA())    
      • S_1. Parte derecha de los segundos.
      • La separación de los dígitos derecho derecho e izquierdo la hago con Izquierdo  Entero(HH/10),Entero(MM/10),Entero(SS/10) y Derecho HH-Entero(HH/10), MM-Entero(MM/10), SS-Entero(SS/10)
      • Estos cálculos los realizo directamente en las variables con nombre. La hoja, por tanto, no contiene nada, está vacía. La información, la hora, la presento cambiando el formato, mediante el formato condicional, de las celdas.
      • Como esta entrada está pensada para trabajar con formatos condicionales el número de segmentos es un poco indiferente, con representar razonablemente todos los números vale. La resolución de cada display depende de lo que deseemos o consideremos que es nuestro objetivo. Cuantos mas puntos mas resolución, mejor representación pero mucho mas trabajo.
      •  Si aumentamos el número de puntos aumentamos el número de funciones que los controlan.
      • Cada punto tiene su propia función.
      • Dibujamos (incluso a mano alzada), los n segmentos.
      • Número a número "dibujamos", realzando, los segmentos que hacen que se vea cada número.
      • En principio la función obtenida, o al menos la mas sencilla de sacar, es del tipo O. Se puede leer "este segmento se enciende cuando H0 vale 0 o cuando vale 2 o cuando vale 6 ..."  (=O(M0=0;M0=2;M0=6;M0=8))
      • Algunas de las funciones obtenidas  se pueden simplificar mediante la función Y, (=Y(H0<>5;H0<>6)), que se puede leer "este segmento se enciende cuando H0 es distinto de 5 y H0 es distinto de 6". Esta función da los mismos resultados que O(H0=0;H0=1;H0=2;H0=3;H0=4;H0=7;H0=8;H0=9;)

      jueves, 10 de abril de 2014

      Reloj Analógico. Gráfica XY dinámica.






      Funciones utilizadas:
      Ahora()
      Residuo()
      Pi()
      Entero()
      Seno()
      Cos()
      Radianes()


      Variables y rangos con nombre:

      Fech
      Horas
      Minutos
      RadHora
      RadMin
      RHora
      RMin
      RReloj
      Segundos
      SegX
      SegY
      XHora
      XSeg:RMin*(SENO(RadMin*Segundos))
      XSeg2:
      RMin*(SENO(RadMin*ENTERO((RESIDUO(AHORA();1)*24*60)*60)))
      YHoras:RHora*(COS(RadHora*Horas))
      YSeg: RMin*(COS(RadMin*Segundos))

      El objeto de este ejercicio es representar un reloj analógico mediante un gráfico xy de excel. Aunque incorporo algo de  programación, el cálculo de los valores de la gráfica lo hago mediante fórmulas excel. Podría hacerlo por programa, pero no es el objeto del ejercicio.

      • La gráfica emula el aspecto de un reloj clásico.
      • Una corona circular dividida en 60 partes, para 60 minutos. 
      • Otra, situada sobre la anterior, dividida en 12 partes, para las 12 horas.
      • Una manecilla de horas. Esta manecilla se debe mueve de manera continua, sin saltos.
      • La hora podría calcularla mediante la función =HORA(A1) pero esto haría que la manecilla se moviese a saltos de una hora, la función hora solo cambia de valor cada hora. Para evitar ese salto calculo la parte no entera de la fecha (vease sistema de fechas en excel)  y la multiplico por 24.  horas = RESIDUO(AHORA();1)*24 y Fech=RESIDUO(AHORA();1)
      • Un minutero. Esta manecilla se debe mover de manera continua, sin saltos.
      • Los minutos podría calcularlos mediante la función =MINUTO(A1) pero esto haría que la manecilla se moviese a saltos. Para evitar ese salto, calculo la parte no entera de la  hora (vease punto anterior)  y la multiplico por 60. minutos=RESIDUO(Fech*24;1)*60.
      • Un segundero. Esta manecilla se mueve de segundo en segundo. ENTERO(RESIDUO(Fech*24*60;1)*60) . Aquí si podría haber utilizado la función SEGUNDO()
      • Los puntos de corona que representa los  minutos las calculo en las columnas M y N de la hoja AUX. Sesenta y un puntos  aunque el último coincide con el primero con el fin de cerrar el circulo (360º/60 = 6º por punto). Cada punto esta calculado en función del radio de la corona y del seno y coseno del ángulo. 60 separaciones dan un efecto circular, no es un circulo pero lo parece.
      • Los puntos de corona que representa las horas las calculo en las columnas I y J de la hoja AUX. Trece puntos calculados en función del radio y del seno y coseno del ángulo . En este caso las 12 separaciones no son suficientes para parecer un círculo, por lo que, manualmente, al preparar la gráfica, elimino los segmentos que unen los puntos entre si.
      • Las tres manecillas tienen un punto común, el centro del reloj, el 0,0.
      • Los puntos para la hora los calculo a partir de un radio mediante el seno y coseno del  ángulo resultante de multiplicar la hora (función Hora()) por 30º (columnas AB), pero convertidos a radianes, que es como se calculan los valores trigonométricos en excel. A su vez hago el cálculo de los valores XY en una variable con nombre, en vez de en una celda. Minutos y segundos utilizan un ángulo de 6º (columnas CD y EF). 
      • La actualización de la hora representada en el gráfico se puede hacer mediante la tecla F9. Funciona pero queda poco bonito, poco útil. Incorporo el mínimo código vbasic que permite actualizar, cada segundo, el reloj.

      Código utilizado para actualizar el reloj:

      El procedimiento Auto_Open se ejecuta al abrir el libro, es el primer procedimiento que se ejecuta. En este caso se limita a seleccionar la hoja RELOJ y a lanzar el procedimiento "RECALCULA"
      Public Proc
      Sub Auto_open()
      Sheets("Reloj").Select
       Proc = "Recalcula"
      Recalcula
      End Sub




      El procedimiento Recalcula recalcula el valor de las fórmulas y prepara la siguiente su siguiente ejecución. Es decir se llama si mismo, pero un segundo después, mediante  el evento, del objeto application, OnTime. La instrucción .OnTime Now() + 0.0000115741 * 1, Proc  se puede leer "Cuando sea la hora actual mas un segundo (0.0000115741 es 1/(24*60*60)) ejecuta el procedimiento Proc. Actualizar un libro excel cada cierto tiempo es así de sencillo.


      Sub Recalcula()
      'Dim Proc


        With Application
        .ScreenUpdating = False
         Calculate
         .ScreenUpdating = True
      .OnTime Now() + 0.0000115741 * 1, Proc 
        End With
        

      End Sub








      miércoles, 26 de febrero de 2014

      Desafío del profesor Letona del 26/02/2014

      Libro EXCEL



      El profesor Letona, para los que no lo sepan, es un tipo que habla de matemáticas en el programa de RNE de las tardes. Normalmente habla los viernes por la tarde y a mi me suele pillar conduciendo. No se porque esta semana ha hablado el Martes, y me ha pillado en casa. La prueba, o al menos lo que yo he entendido es que se debe encontrar el máximo resto que se puede dar al dividir un número de dos cifras entre la suma de esas cifras. Hecho con Excel, sin mas. De momento no se si voy a pensarlo mas. Si me decido ( y lo encuentro) ya subiré los resultados.

      Funciones utilizadas:
      • Derecha(). Separo el número de la derecha.
      • Izquierda(). Separo el número de la izquierda.
      • Revisando, me acabo de dar cuenta de que tengo un error en las cabeceras Izquierda y Derecha, estan cambiadas de posición.
      • Operación suma. Los sumo (I+D).
      • Residuo(). Calculo el resto de dividir el número por i+d.
      • Max(). Encuentro el máximo de los restos.
      • Coincidir(). Encuentro la línea en la que está ese máximo.
      • Indice(). Presento el valor encontrado.
      • Esta vez no utilizo ni rangos ni variables con nombre.



      sábado, 25 de enero de 2014

      Forma y tamaño de un área. Encimera de mi cocina.









      Tengo que cambiar la encimera de cocina, he retirado un mueble y eso me obliga a cambiar la encimera. Para medir la parte de la cocina que ocupa la encimera utilizo un método gráfico reconvertido a excel . 

      El método gráfico consiste en:
      • Hay que dibujar un plano a mano alzada de la zona a medir. 
      • Sobre el lugar, en mi caso sobre la encimera actual, situamos o marcamos dos focos (F1,F2) o puntos desde los que se va a medir las distancias a los vértices, procurando que desde cada foco se vean los vertices. Si no se viesen, habría que situar otros focos secundarios, lo que complica el dibujo. Mides la distancia entre focos y las anotas en el plano. 
      • Mides la distancia entre cada vértice y los dos focos (las anotas).
      • Para dibujar el plano gráficamente primero dibujas a escala los focos y con un compás, también a escala, con radio igual a la distancia entre F1 y el punto trazas un arco y entre F2 y el punto trazas otro arco. La intersección de los arcos supone que sitúas sobre el plano, ya a escala,  el punto o vértice.
      • Vamos a dibujar el plano convirtiendo este método gráfico a un gráfico xy de excel.
      • Si dibujas los dos focos , el punto, y los unes, veras que forman un triangulo. De ese triangulo conoces los tres lados.



      • Para pasar a coordenadas cartesianas utilizamos, en un primer paso, la línea que une ambos focos como eje  X y F1 como cero del eje X.
      • En el libro excel situamos la distancia entre focos en la hoja Puntos!$A$2. Este celda, a su vez, la utilizo para dar valor a la variable DF.
      • Aplicando el teorema del coseno, según la imagen, calculamos el coseno del ángulo (en el libro excel hoja puntos rango E2:E10). A partir del coseno calculamos el ángulo y, conocido el ángulo, calculamos el seno (rango F2:10). 
      • Conocidos seno, coseno y distancia (D) entre F1 y el punto, x=D*cos, y=D*sen (Puntos!I2I10 y Puntos!J2J10).  El ángulo se calcula a partir del coseno. En realidad ese cálculo da dos resultados (+ -) lo que si afecta al valor de Y. Por eso introduzco, a mano, un factor (1 o -1) para el signo de Y, uno si el valor de Y está por encima del eje X y menos uno si está por debajo.
      • Puede suceder que haya  una esquina a la que no se  llegue, o no te apetezca mover el microondas (en mi caso). Si podemos suponer que las paredes son lineales se puede calcular la intersección de dos líneas (puntos realzados en el libro excel, rango K6:N6 ).
      • Una vez calculados los distintos X,Y se pasan un gráfico de excel XY. Modificas el gráfico para que X e Y tengan la misma escala y la retícula tenga el mismo tamaño por unidad para el eje X y para el eje Y.
      • Esta primera gráfica nos coloca en una posición poco útil el plano, por eso es conveniente tener la posibilidad de disponer de un cambio de ejes.  En este caso lo he preparado para que cada cambio de eje ponga uno de los lados  paralelo al eje X.
      • Cada lado forma un ángulo con respecto al eje definido por los dos focos. Como tengo al menos dos puntos por pared (línea) calculo ese ángulo encontrando primero la pendiente de la línea, (y2-y1)/(x2-x1), (hoja puntos, rango K3:K9) para después hcer una rotación de ejes utilizando ese ángulo.
      • Paso estos valores a las variables Eje1,Eje2,Eje3 y Eje4. En la siguiente versión el cálculo se puede efectuar directamente al dar valor a la variable, en vez de Eje2=Puntos!K6, Eje2=(Puntos!J6-Puntos!J5)/(Puntos!I6-Puntos!I5).
      • Ordeno un poco el tema de los ejes el la hoja Ejes. Paso los valores de las pendientes al rango A3:A6, calculo seno y coseno correspondientes en B2:B6. 
      • Ejes!F3 es la celda vinculada al desplegable de selección de eje. El valor del seno y del coseno seleccionado los sitúo en Ejes!G3 y en Ejes!F3, mediante la función =ÍNDICE($D$2:$D$6;$F$3). Esta operación se podría hacer asignando estos valores directamente a una variable.
      • Además de rotar, desplazo los ejes para que no haya valores, ni de X ni de Y por debajo de 0. Para ello calculo los valores mínimos de X y de Y (función MIN()). Esta operación de puede hacer directamente sobre una variable. 
      • Los valores rotados y desplazados, rango CambioEjes!G2:H10 ,los llevo a otra gráfica XY con un desplegable que me permite seleccionar la posición en la que quiero ver el plano.

      Hay que medir con mucha exactitud, una diferencia de medio centímetro, en estas dimensiones, produce un gran error. Si mides bien el resultado es bastante exacto.