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:
Ya se que no es un tema habitual, pero con FW se puede hacer todo
De momento lo llevo así (la velocidad y rumbo no sale porque estoy parado):
Gracias de antemano, aunque me voy de vacaciones intentaré seguir el post.
Rotar BitMap para brujula GPS
- Sebastián Almirón
- Posts: 125
- Joined: Mon Dec 12, 2005 9:56 am
- Location: Moralzarzal - Spain
- Andrés González
- Posts: 625
- Joined: Thu Jan 19, 2006 10:45 am
- Location: Mallorca
Re: Rotar BitMap para brujula GPS
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
Andrés González desde Mallorca
Re: Rotar BitMap para brujula GPS
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
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
- Sebastián Almirón
- Posts: 125
- Joined: Mon Dec 12, 2005 9:56 am
- Location: Moralzarzal - Spain
Re: Rotar BitMap para brujula GPS
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
Saludos
- Willi Quintana
- Posts: 859
- Joined: Sun Oct 09, 2005 10:41 pm
- Location: Cusco - Perú
- Contact:
Re: Rotar BitMap para brujula GPS
Hola, baja esta fuentes de un reloj analogo,,, puede servirte..
Salu2
https://rapidshare.com/files/449953331/reloj.zip
Salu2
https://rapidshare.com/files/449953331/reloj.zip
Re: Rotar BitMap para brujula GPS
Hola Sebastián
Pregunta: que dispositivo GPS estas usando para hacer pruebas con tu apliacacion?
Gracias
Saludos
Pregunta: que dispositivo GPS estas usando para hacer pruebas con tu apliacacion?
Gracias
Saludos
Visite Chiapas, el paraiso de México.
- Sebastián Almirón
- Posts: 125
- Joined: Mon Dec 12, 2005 9:56 am
- Location: Moralzarzal - Spain
Re: Rotar BitMap para brujula GPS
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