Page 1 of 1

Rotar BitMap para brujula GPS

Posted: Thu Aug 02, 2012 4:18 pm
by Sebastián Almirón
Hola a todos,

¿ Hay alguna manera de rotar un Bitmap ?

Estoy haciendo una aplicación para GPS y de momento me funciona bien. El GPS manda cadenas NMEA a un puerto serie virtual (el GPS es USB) y así obtengo los datos de altitud, longitud, altura, velocidad, rumbo, nº de satelites, precisión y muestro la posición sobre un mapa de Google, de momento me funciona muy bien aunque tengo pendiente aun de conseguir cargar mapas OpenStreetMap offline, para que el mapa se vea sin acceso a internet. El caso es que el GPS me manda la variación magnetica y quiero aprovechar ese dato para mostrar una brújula, pero para ello debo saber antes como rotar su dibujo:
Image

Ya se que no es un tema habitual, pero con FW se puede hacer todo :D

De momento lo llevo así (la velocidad y rumbo no sale porque estoy parado):
Image

Gracias de antemano, aunque me voy de vacaciones intentaré seguir el post.

Re: Rotar BitMap para brujula GPS

Posted: Sat Aug 04, 2012 11:29 am
by Andrés González
Vi ejemplos de movimientos de las agujas del reloj de C5, supongo que se podría utilizar algún ejemplo para hacer lo mismo.

Re: Rotar BitMap para brujula GPS

Posted: Sun Aug 05, 2012 4:51 pm
by pgfdz
Esta es la rutina que gira lo que estés pintando en un DC en un momento dado

Un saludo

#include "fivewin.ch"

static oWnd
static nAngle := 0

function main()


DEFINE WINDOW oWnd TITLE "Rotando bitmap"

oWnd:bKeyDown := {|nKey,nFlags| oWnd:cTitle := "Rotando bitmap. " + str(nKey), if( nKey == 37, nAngle -= 5, if( nKey == 39, nAngle += 5, nil) ), oWnd:Refresh() }



ACTIVATE WINDOW oWnd ON PAINT Pinta(hDC)



return 0

function pinta( hDC )
local hBitmap := ReadBitmap(hDC, "compass.bmp" )
local i

if hBitmap != 0
// el tamaño del bitmap es 211 x 211
i = Begin_Rotate( hDC, nAngle, 211/2, 211/2 )
DrawBitmap( hDC, hBitmap, 0, 0 )
End_Rotate(hDC, i )

DeleteObject( hBitmap )

endif


return nil

#pragma BEGINDUMP

#include <hbapi.h>
#include <windows.h>
#include <math.h>

HB_FUNC( BEGIN_ROTATE )
{
HDC hDc = (HDC) hb_parnl( 1 );
int nGraphicsMode = SetGraphicsMode(hDc, GM_ADVANCED);
XFORM xform;
double fangle;
int m_iAngle = hb_parni( 2 );

POINT centerPt;
centerPt.y = hb_parni( 3 );
centerPt.x = hb_parni( 4 );


if ( m_iAngle != 0 )
{
fangle = (double)m_iAngle / 180 * 3.1415926;
xform.eM11 = (float)cos(fangle);
xform.eM12 = (float)sin(fangle);
xform.eM21 = (float)-sin(fangle);
xform.eM22 = (float)cos(fangle);
xform.eDx = (float)(centerPt.x - cos(fangle)*centerPt.x + sin(fangle)*centerPt.y);
xform.eDy = (float)(centerPt.y - cos(fangle)*centerPt.y - sin(fangle)*centerPt.x);

SetWorldTransform(hDc, &xform);
}
hb_retni( nGraphicsMode );

}



HB_FUNC( END_ROTATE )
{
HDC hDc = (HDC) hb_parnl( 1 );
XFORM xform;
int nGraphicsMode = hb_parni( 2 );

xform.eM11 = (float)1.0;
xform.eM12 = (float)0;
xform.eM21 = (float)0;
xform.eM22 = (float)1.0;
xform.eDx = (float)0;
xform.eDy = (float)0;

SetWorldTransform(hDc, &xform);
SetGraphicsMode(hDc, nGraphicsMode);
hb_ret();
}

#pragma ENDDUMP

Re: Rotar BitMap para brujula GPS

Posted: Mon Aug 27, 2012 4:22 pm
by Sebastián Almirón
Muchas gracias a ambos, despues de las vacaciones he probado el código que ha incluido Paco y funciona bien, me falta hacer que funcione en un dialogo de recursos, pero en la ventana principal va bien.

Saludos

Re: Rotar BitMap para brujula GPS

Posted: Mon Aug 27, 2012 8:22 pm
by Willi Quintana
Hola, baja esta fuentes de un reloj analogo,,, puede servirte..
Salu2

https://rapidshare.com/files/449953331/reloj.zip

Re: Rotar BitMap para brujula GPS

Posted: Fri Sep 07, 2012 2:03 am
by devtuxtla
Hola Sebastián

Pregunta: que dispositivo GPS estas usando para hacer pruebas con tu apliacacion?

Gracias

Saludos

Re: Rotar BitMap para brujula GPS

Posted: Fri Sep 21, 2012 3:13 pm
by Sebastián Almirón
devtuxtla wrote:Hola Sebastián

Pregunta: que dispositivo GPS estas usando para hacer pruebas con tu apliacacion?

Gracias

Saludos



Perdona por tardar tanto en responder, estoy utilizando este:
http://www.ebay.es/itm/GPS-Receiver-USB-DONGLE-SAT-NAV-ON-PC-Netbook-Laptop-/300558586966?pt=UK_In_Car_Technology&hash=item45fab01456

Aunque este al final no envía la variación magnetica, esos datos en el código NMea que envía al puerto están siempre vacíos :x