Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Convertir decimales a radianes (https://www.clubdelphi.com/foros/showthread.php?t=10921)

Picard 01-06-2004 18:21:28

Convertir decimales a radianes
 
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,
Código:

 
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??

Código:

  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 .
Código:


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


La franja horaria es GMT +2. Ahora son las 07:08:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi