PDA

Ver la Versión Completa : Convertir decimales a radianes


Picard
01-06-2004, 18:21:28
Sabeis de algun metodo para convertir decimales a radianes? en los ejemplos de easymap vcl me lo hace asi, pero esta en pascal y no tengo ni idea de como hacerlo en c++ builder,

procedure TfrmMain.MapMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
DisplayPosition(X,Y);
end;

procedure TfrmMain.DisplayPosition(X, Y: Integer);
var
mX, mY: Extended;
degX, minX, secX, degY, minY, secY: Integer;
signX, signY, sX, sY: String;
begin
if Map.Layers.Count = 0 then Exit;
Map.ScreenToMap(X, Y, mX, mY);
if actPositionInDegree.Checked then
begin
if mx < 0 then signX := '-' else signX := '';//'+';
mX := abs(mX);
degX := trunc(int(mX));
minX := trunc(int((mX-degX)* 60));
secX := trunc(int((mX-degX-minX/60)*3600));
sX := Format('%S%-.3D-%.2D''%.2D"', [signX, degX, minX, secX]);

if mY < 0 then signY := '-' else signY := '';//'+';
mY := abs(mY);
degY := trunc(int(mY));
minY := trunc(int((mY-degY)* 60));
secY := trunc(int((mY-degY-minY/60)*3600));
sY := Format('%S%-.3D-%.2D''%.2D"', [signY, degY, minY, secY]);
end
else
begin
sX := Format('%F', [mX]);
sY := Format('%F', [mY]);
end;
StatusBar.Panels[1].Text := Format('X=%S Y=%S', [sX, sY]);
end;




gracias

jachguate
02-06-2004, 05:56:42
Es simplemente una regla de 3.

Ahora, no se que son "decimales" exactamente... pues hay grados sexagecimales y centecimales que creo que son a los que te referis (y por cierto, no tienen nada que ver con el código publicado).

(pi) radianes = 400 grados centecimales = 360 grados sexagecimales.

Hasta luego.

;)

Picard
02-06-2004, 17:42:13
he de convertir 41.310113 a grados,minutos y segundos, son datos de latitud y longitud,lo que no entiendo es que me digas que no tiene nada que ver con el codigo que he puesto en pascal ya que es el codigo de ejemplo que me aparece en las ayudas de easymap vcl,el plugin con el que visualizo ma`pas desde mi aplicacion.

gracias

jachguate
02-06-2004, 17:54:09
Bueno... en realidad no tiene nada que ver con el título del mensaje, pues no aparecen los radianes por ningun lado....

Ahora veo que lo que está mal, es precisamente el título, pues lo que queres es mostrar un angulo en formato de grados/minutos/segundos, es asi??


pseudocodigo:
grados = parteentera(angulo);
resto = partedecimal(angulo) * 60
minutos = parteentera(resto)
resto = partedecimal(resto) * 60
segundos = parteentera(resto)


Hasta luego.

;)

Picard
02-06-2004, 21:47:31
Creo que si, en realidad ya estoy mas perdido que un pulpo en un garage,veras te explico de que va.

utilizo un componente para visualizar mapas,en realidad, es un componente gis para c++ builder y delphi.pero como lleva cartografia mundial incorporada y georeferenciada en formato .mif,ya me vale, al menos es mas barato (70€) que comprar las sdk,s de c-map (7500 $ USA).Asi paso los valores de las coordenadas del mapa a dos TLabel .

void __fastcall TfrmPrincipal::EasyMap1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
long double fX,fY;
AnsiString buf;
EasyMap1->ScreenToMap(X,Y,fX,fY);
lblLatMouse->Caption = buf.sprintf("%2Lf",fY);
lblLongMouse->Caption = buf.sprintf("%2Lf",fX);
Application->ProcessMessages();
}

Pero claro como nada es perfecto me da esos valores asi: 41.235110 y 3.152003.
con el codigo que puse en el primer hilo deberia pasar estos datos a grados,minutos y segundos pero esta en pascal y poco que domino c++ imaginate la de problemas que tengo para adaptar un codigo pascal a c++.he probado infinidad de cosas,pero el resultado no cambia en nada.
espero haberme explicado correctamente.
Gracias

roman
02-06-2004, 22:06:04
Si me permiten dar mi opinión:

Yo creo que te estás liando al tratar de adaptar directamente el código que escribes. Lo que jachguate te puso fue un pseudocódigo y la ventaja de esto es que no está ligado a ningún lenguaje en particular de manera que ya sólo tienes que consultar la documentación de C++ para ver qué funciones ahí hacen el papel de parteentera() y partedecimal().

// Saludos

Picard
05-06-2004, 11:43:47
Lo solucione asi:
String DecASexa(long double dec)
{
short grados = dec;
long double temp = std::fabsl(dec - grados);
unsigned short minutos = (temp *= 60);
unsigned short segundos = (temp-minutos) * 60;
return Format("%d\xB0 %d' %d\"", ARRAYOFCONST((grados, minutos, segundos)));
}

void __fastcall TfrmPrincipal::EasyMap1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
//long double fX,fY;
long double Latitud1;
long double Longitud1;

EasyMap1->ScreenToMap(X,Y,Latitud1,Longitud1);
lblLatMouse->Caption = (DecASexa(Latitud1));
lblLongMouse->Caption = (DecASexa(Longitud1));
Application->ProcessMessages();
}
//---------------------------------------------------------------------------
Ahora necesito,por ej : 41º26'34" = 41º26'34"N ó -41º26'34" = 41º26'34"S
Gracias