0 Members and 1 Guest are viewing this topic.
oapiGlobalToLocal ( OBJHANDLE hObj, const VECTOR3 * glob, VECTOR3 * loc ) Maps a point from the global frame to a local object frame.
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *//* Vincenty Inverse Solution of Geodesics on the Ellipsoid (c) Chris Veness 2002-2010 *//* *//* from: Vincenty inverse formula - T Vincenty, "Direct and Inverse Solutions of Geodesics on the *//* Ellipsoid with application of nested equations", Survey Review, vol XXII no 176, 1975 *//* http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf *//* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *//** * Calculates geodetic distance between two points specified by latitude/longitude using * Vincenty inverse formula for ellipsoids * * @param {Number} lat1, lon1: first point in decimal degrees * @param {Number} lat2, lon2: second point in decimal degrees * @returns (Number} distance in metres between points */function distVincenty(lat1, lon1, lat2, lon2) { var a = 6378137, b = 6356752.314245, f = 1/298.257223563; // WGS-84 ellipsoid params var L = (lon2-lon1).toRad(); var U1 = Math.atan((1-f) * Math.tan(lat1.toRad())); var U2 = Math.atan((1-f) * Math.tan(lat2.toRad())); var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1); var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2); var lambda = L, lambdaP, iterLimit = 100; do { var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda); var sinSigma = Math.sqrt((cosU2*sinLambda) * (cosU2*sinLambda) + (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda)); if (sinSigma==0) return 0; // co-incident points var cosSigma = sinU1*sinU2 + cosU1*cosU2*cosLambda; var sigma = Math.atan2(sinSigma, cosSigma); var sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma; var cosSqAlpha = 1 - sinAlpha*sinAlpha; var cos2SigmaM = cosSigma - 2*sinU1*sinU2/cosSqAlpha; if (isNaN(cos2SigmaM)) cos2SigmaM = 0; // equatorial line: cosSqAlpha=0 (§6) var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha)); lambdaP = lambda; lambda = L + (1-C) * f * sinAlpha * (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM))); } while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0); if (iterLimit==0) return NaN // formula failed to converge ** Oh OH ? J'espère que cela n'arrive pas souvent....** var uSq = cosSqAlpha * (a*a - b*b) / (b*b); var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq))); var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq))); var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)- B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM))); var s = b*A*(sigma-deltaSigma); s = s.toFixed(3); // round to 1mm precision ** Oh les menteurs ! Ils avaient dit 0.5mm :) ** return s;}
Mais... il suffit, si l'on veut séparer les coordonnées de distances en X et en Y (pour les POS y alt x )d'utiliser 2 fois l'algorythme, avec successivement les valeurs de l'autre axe à "0".
avec successivement les valeurs de l'autre axe à "0"
l'autre axe à "0"
avec successivement
Cette page que tu cites N'OFFRES PAS l'algorithme
et tu es sûr qu'en visualisant le fichier HTML on ne trouve pas l'algorythme ?
en ce qui concene l'algorythme en C je propose la méthode suivante :tu place d'abord un mesh précis genre un cube à +500 m et +800 m d'une base,ensuite tu poses un DG3 exactement à l'endroit du cube.Après, tu essayes d'utiliser le code c++ trouvé, avec par 2 fois, les coordonnées entre la base et le DG3 pour trouver les 2 axes.et tu vois si cela te donne une valeur pas trop éloignée de +500 m et +800m.
procéder par MP, mais c'est encore trop abstrait
c'est mon inconscient qui peut être me joue des tours depuis la plus petite enfance
Date 26-07-2010 20:59
j'ai procédé en 2 temps :j'ai cherché sur l'axe des x en donnant d'abord les longitudes :2.3212010 et 2.348201 avec des latitudes toutes les 2 à 0ainsi j'ai obtenu ma première distance vol d'oiseau à noter dans X , genre par exemple 2020 mpuis j'ai fait la même démarche pour Y, en obtenant 1490 m et ainsi (j'aurais) pu placer mon mesh correctement ( si mon Paname n'avait pas un scale de 1.1 sur l'axe des X)
double rBase,rVessel;double Latitude1,Longitude1,Latitude2,Longitude2,rayon;double distanceLon,distanceLat ;double x,y,z;//rayon de la planeterayon=oapiGetSize(stat.rbody) ; //récupère la position equatoriale de la base résultat en radiansoapiGetBaseEquPos(HBase,&Longitude2,&Latitude2,&rBase);//récupère la position equatoriale du vaisseau résultat en radiansMeshBuilder->GetEquPos(Longitude1,Latitude1,rVessel);// distance entre les deux pointsdouble distance = rayon * 3.1415926 *sqrt((Latitude1-Latitude2)*(Latitude1-Latitude2)+cos(Latitude1/57.29578 )*cos(Latitude2/57.29578 )*(Longitude1-Longitude2)*(Longitude1-Longitude2))/ 180;
BEGIN_OBJECTLISTMESHFILE SCALE POSOWNMATERIALSHADOWSPRELOADEND Distance en metres 0.0265458 Distance en metres 0.0265458 Distance en metres 0.0265458
BEGIN_OBJECTLISTMESHFILE SCALE POSOWNMATERIALSHADOWSPRELOADEND Distance en metres 135.686 Distance en metres 135.523 Distance en metres 135.375 Distance en metres 135.242BEGIN_OBJECTLISTMESHFILE SCALE POSOWNMATERIALSHADOWSPRELOADEND Distance en metres 135.124 Distance en metres 135.022 Distance en metres 134.936 Distance en metres 134.865
double distance = rayon * 3.1415926 *sqrt((Latitude1-Latitude2)*(Latitude1-Latitude2)+cos(Latitude1/57.29578 )*cos(Latitude2/57.29578 )*(Longitude1-Longitude2)*(Longitude1-Longitude2))/ 180;
//methode d'origine/*double distance = rayon * 3.1415926 *sqrt((Latitude1-Latitude2)*(Latitude1-Latitude2)+cos(Latitude1/57.29578 )*cos(Latitude2/57.29578 )*(Longitude1-Longitude2)*(Longitude1-Longitude2))/ 180;*///methode d'essaidouble distance = rayon * 3.1415926 *sqrt((Latitude2-Latitude1)*(Latitude2-Latitude1)+cos(Latitude2/57.29578 )*cos(Latitude1/57.29578 )*(Longitude2-Longitude1)*(Longitude2-Longitude1))/ 180;oapiWriteScenario_float (fichierConf,"Distance en metres",distance);
BEGIN_OBJECTLISTMESHFILE SCALE POSOWNMATERIALSHADOWSPRELOADEND Distance en metres 134.726 Distance en metres 134.726 Distance en metres 134.726 Distance en metres 134.726