Rotar BitMap para brujula GPS

Rotar BitMap para brujula GPS

Postby Sebastián Almirón » Thu Aug 02, 2012 4:18 pm

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
Sebastián Almirón
 
Posts: 157
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Rotar BitMap para brujula GPS

Postby Andrés González » Sat Aug 04, 2012 11:29 am

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

Re: Rotar BitMap para brujula GPS

Postby pgfdz » Sun Aug 05, 2012 4:51 pm

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
pgfdz
 
Posts: 145
Joined: Wed Nov 03, 2010 9:16 am

Re: Rotar BitMap para brujula GPS

Postby Sebastián Almirón » Mon Aug 27, 2012 4:22 pm

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
Sebastián Almirón
 
Posts: 157
Joined: Mon Dec 12, 2005 9:56 am
Location: Moralzarzal - Spain

Re: Rotar BitMap para brujula GPS

Postby Willi Quintana » Mon Aug 27, 2012 8:22 pm

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

https://rapidshare.com/files/449953331/reloj.zip
User avatar
Willi Quintana
 
Posts: 1018
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: Rotar BitMap para brujula GPS

Postby devtuxtla » Fri Sep 07, 2012 2:03 am

Hola Sebastián

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

Gracias

Saludos
Visite Chiapas, el paraiso de México.
devtuxtla
 
Posts: 392
Joined: Tue Jul 29, 2008 1:55 pm

Re: Rotar BitMap para brujula GPS

Postby Sebastián Almirón » Fri Sep 21, 2012 3:13 pm

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 31 guests