Rotar BitMap para brujula GPS

Post Reply
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Rotar BitMap para brujula GPS

Post 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.
User avatar
Andrés González
Posts: 625
Joined: Thu Jan 19, 2006 10:45 am
Location: Mallorca

Re: Rotar BitMap para brujula GPS

Post 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.
Saludos

Andrés González desde Mallorca
pgfdz
Posts: 145
Joined: Wed Nov 03, 2010 9:16 am

Re: Rotar BitMap para brujula GPS

Post 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
Paco García
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Rotar BitMap para brujula GPS

Post 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
User avatar
Willi Quintana
Posts: 859
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú
Contact:

Re: Rotar BitMap para brujula GPS

Post by Willi Quintana »

Hola, baja esta fuentes de un reloj analogo,,, puede servirte..
Salu2

https://rapidshare.com/files/449953331/reloj.zip
devtuxtla
Posts: 392
Joined: Tue Jul 29, 2008 1:55 pm

Re: Rotar BitMap para brujula GPS

Post by devtuxtla »

Hola Sebastián

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

Gracias

Saludos
Visite Chiapas, el paraiso de México.
User avatar
Sebastián Almirón
Posts: 125
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Rotar BitMap para brujula GPS

Post 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 ... 45fab01456

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
Post Reply