Trigonometria e Flight Sim

Vespa1
Primo post in questo forum per cui inizio con un saluto alla comunità di questo Forum.

Ho deciso di registrarmi e postare per cercare di risolvere un problema di trigonometria applicata ad una Flight Sim.
Sono il Project Director di Target Tobruk (http://www.targettobruk.net), una simulazione di volo basata sull'engine di Targetware.

Nella nostra attività di sviluppo ci siamo imbattuti in questo problema: per la definizione delle condizione meteo di ogni punto sulla superfice terrestre dobbiamo identificare le tre stazioni METAR più vicine al punto preso in considerazione, verificando che il punto cada nel triangolo descritto dai tre vertici rappresentati dalle stazioni. Come dati abbiamo solo le Latitudini/Longitudini di ogni punto.

Al momento abbiamo risolto il problema per la determinazione delle tre stazioni METAR più vicine con il seguente algoritmo (ho inserito quale esempio i dati di Roma e Ladipoli):

decLatA = 41.96255363 -- Latitude of Rome
decLonA = 12.06951141 -- Longitude of Rome
decLatB = 41.86222614 -- Latitude of Ladispoli
decLonB = 12.45510578 -- Longitude of Ladispoli

R = 6372.795477598

radLatA = math.rad(decLatA)
radLonA = math.rad(decLonA)
radLatB = math.rad(decLatB)
radLonB = math.rad(decLonB)

fi = math.abs(radLonA - radLonB)

P = math.acos((math.sin(radLatA) * math.sin(radLatB)) + (math.cos(radLatA) * math.cos(radLatB) * math.cos(fi)))

distance = P * R



Ci siamo impantanati sulla determinazione della posizione del punto rispetto al triangolo sopredescritto.

Come risolvere la cosa?

Risposte
Angus_Mac
Scusa facendo questo tu calcoli la distanza tra i due punti (roma e ladispoli), se non ho letto male l'algoritmo tu quindi vorresti sapere ess se l'aereo cade nel'area del tiango formato dalle tre stazioni meteo (quali roma ladispoli e l'altra)?

Per triangolo Equilatero
Se è così potresti calcolare la distanza dal punto in cui è l'aereo, che dovresti conoscere e i tre punti delle stazioni meteo il perimetro che ne deriverebbe dovrebbe essere < alla somma dei due lati del triangolo formato dalle stazioni, per ulteriori info scrivi

Vespa1
Specifico meglio il procedimento.

Per ogni utente l'engine del gioco resitituisce ogni istante la posizione in Latitudine e Longitudine.
Per determinare le condizioni meteo del punto in cui è situato l'utente devo calcolare la media delle condizioni meteo delle tre stazioni più vicine, verificando appunto che l'utente ricada nel triangolo descritto dalle tre stazioni.

Utilizzando l'algoritmo sopra descritto, determino la distanza dell'utente da ogni stazione METAR disponibile leggendone le coordinate Lat/Long da un database, effettuando un sort dei risultati estraggo le tre più vicine.

Ad esempio per un utente situato alle coordinate 45-39N 012-11E 23M ottengo le seguenti tre stazioni di cui conosco distanza (in Km) dall'utente e coordinate Lat/Lo
LIPV - 32.39 - 44-28N 011-08E
LIPZ - 22.06 - 43-29N 013-09E
LIPS - 9.958 - 42-34N 014-10E

Angus, è applicabile la tua soluzione con questi dati?

Angus_Mac
Allora forse ho capito quindi tu conosci alla fine Longitudine e latitudine delle tre stazioni quindi con l'algoritmo conosci la distaza dall'aereo a ogniuno delle tre la somma di queste 3 distanze deve essere minore alla distanza tra A e B che sono le due stazioni METER RIVELEATE moltiplicato per 2 questo è valido solo se le stazioni meter formano un triangoo equilatero, inoltre siccome rilevi da un database le tre stazioni più vicine può esserci la possibilità che i tre vertici del triangol onon formino un triangolo equilatero se fosse così, dimmelo che trovo una soluzione alternativa a questa del trinagolo equilatero

Vespa1
E' corretto Angus, non esiste alcuna certezza che il triangolo formato dalle tre stazioni sia equilatero o anche triangolo rettangolo.

Le stazioni METAR dislocate sul territorio http://www.meteoam.it/modules.php?name=metar non in modo tale da costituire triangoli regolari.

Angus_Mac
Allora ho trovato una soluzione semplice secondo me che può risolvere il tuo problema allora tu conosci la locazione delle tre stazioni metereologiche quindi si può risalire alla distanza dei tre lati che formano del triangolo fatto ciò si ricava l'aera di questo triangolo e la chiamiamo A1 tramite questa formula:
$P=a+b+c$ che non è nientaltro che il perimetro
$K=$$P/2$*$(P/2-a)$*$(P/2-b)$*$(P/2-c)
$A1=$$sqrt(K)$
Trovato l'aera del triangolo composto dalle stazioni METER procedi a ricavare i tre triangoli che si realizzano tra te e le stazioni fatto questo calcoli sempre l'area di qusti triangoli dopo di che sommi le tre aree l'area risultante la chiamerai $A2$
dopo di che ti basterà fare un confronto pre cui $A1=A2$ se viene rispettata vorà dire che l'aereplano si trova nel triangolo, se non mi sono spiegato ti invio via email un disegno

Vespa1
Sembra interessante........la risposta è molto chiara, grazie.

Provo ad implementarla subito in linguaggio LUA e riporterò se funziona come previsto

Angus_Mac
Scusa la mia domanda ma questo simultore di volo per che cosa serve, posso escludere che sia per un semplice video gioco dal fatto che tu tieni conto anche della curvatura dell'asse terrestre. cmq se hai ancora qualche problema chiedi pure

Vespa1
Invece si tratta di un semplice videogioco, è una simulazione di volo che è quanto più di vicino ci possa essere al reale: la Terra è riprodotta nella sua effettiva forma sferoidale e le coordinate per la navigazione sono le reali WGS84, tutta l'orografia del terreno, coste, fiumi, strade e città sono ottenute scaricando on-the-fly i dati disponibili su diversi database NASA con informazioni ottenute dalle missioni Shuttle di scansione della crosta terrestre.
Anche le stelle ed i pianeti sono al loro posto reale e di notte è pertanto possibile fare navigazione astrale, la fisica degli oggetti (aerei, navi) è riprodotta nel modo più reale possibile sebbene alcune semplificazioni sono indispensabili per consentire al gioco di girare su macchine di varia potenza.

Angus_Mac
Alla faccia del semplice video gioco la parte che si occupa delle stazioni meter per cosa serve nel video gioco?, ti faccio queste domande perchè mi piace il genere di simulatori di volo da quanto ho visto gli aerei sono della seconda guerra mondiale? oppure anche recenti è soprattutto nel simulatore si devono fare dei combattimenti?

Vespa1
Il nostro team lavora ad un MOD ambientato durante la Seconda Guerra, anni 1940-1944, Nord Africa, ed è incentrato sugli aerei italiani.
Ci sono altri gruppi che lavorano a MOD ambientati in Vietnam, anni '60 con i primi Jet, ed un altro ancora ambientao duante il conflitto 15-18 con biplani legno e tela: l'engine di Targetware consente questo in quanto definisce regole di gestione della fisica reali e pertanto applicabili ad ogni tipo di velivolo.

Il parsing delle stazioni METAR è necessario per implementare fenomeni metereologici dinamici e conformi a quanto accade nella realtà. I team di sviluppo infatti possono intervenire pesantemente nello sviluppo della interattività dell'ambiente con un linguagio di scripting leggero e potentissimo (è incluso in molti videogiochi di ultima generazione) che si chiama LUA (http://www.lua.org), il codice che avevo postato sopra infatti è uno stralcio del file LUA per il calcolo delle distanze tra stazioni.

Angus_Mac
Interessante questo progetto molto. Ho visto i modelli di aerei che software è stato utilizzato 3DS MAX, per quanto riguarda il linguaggio LUA è lo stesso usato nel video gioco X Pand Rally si basa su degli script che sono esterni al file exe ma richiamati giusto? e questo che intendevi, ho visto il forum riguardante il progetto magari un giorno vengo a farci un salto (Il sistema per stabilire se la posizione del veivolo era nel triangolo funziona?)

Vespa1
L'engine supporta nativamente vari formati di file 3D, alcuni di noi modellano con 3DS Max, altri con Lightwave, altri ancora con AC3D o con Blender.
La prossima versione dell'engine introdurrà il supporto a COLLADA ampliando ulteriormente il supporto a diversi formati.

Non ricordo se X Pand Rally supporta LUA ma è molto probabile dal momento che viene ormai incluso in ogni nuovo videogioco. Come correttamente scrivi si tratta di file esterni al core principale e da questi richiamati attraverso delle API.

Ancora non ho completato il file per il parsing dei METAR, appena testato il tutto riporto qui come è andata.

Angus_Mac
Si allora intendevamo la medesima cosa l'unico problema e che il gioco e vulnerabila alle modifiche, se avessi bisogno di modellazioni o altro chiedi pure cmq credo che uno dei primi sia stato X Pand Rally ad utilizzare questo sistema di fatto lo rendeva allo stesso tempo alto di grafica con un motore eccellente. ma non era stato adottato dall'Ubisoft in alcuni giochi succesivi se ben ricordo quali prince of persia 2

Vespa1
Cosa intendi per vulnerabile alle modifiche?
Nel caso di Targetware l'applicazione host verifica la congruità dei files presenti sulle macchine client che si collegano per il gioco online e se trova delle discordanze semplicemente sovrascrive i files che sono stati modificati dall'utente e che non cambaciano con quanto presente sul server; questo controllo inoltre viene effettuato non sui files presenti sul disco fisso dei client ma sui dati caricati in RAM per l'esecuzione del gioco; risulta in tal modo realmente difficile ipotizzare la modifica di file non autorizzata.

Cosa intendi per ...se avessi bisogno di modellazioni?

Angus_Mac
Allur per la prima ok se il sistema effettua un controllo, allora niente, da fa mi riferivo a una tipologia, per la seconda siccome ho già fatto modelli per dei gioch i n quel senso, se ti interessava avere un modello, o altro

Vespa1
Interessante! Cosa usi per la modellazione? Posso vedere qualcosa?

Angus_Mac
ti ho scritto via PM

marmi1
ciao,
tornando al problema, mi sono venuti in mente due ulteriori modi (meno eleganti della formula di Erone)
siano a b c i vertici e x il punto di cui si vuole sapere se sta dentro o fuori:

1. trovare i coeff. angolari di ab ac cb ax bx (siano mab, mac, ...) se max è compreso tra mab e mac, e
mbx è compreso tra mbc e mab il punto è interno.
2. date le rette passanti per i vertici (rab, rac,rbc), se, per ogni retta, x e il vertice fuori dalla retta sono nello stesso
semipiano, il punto è interno. Ossia se a e x sono nello stesso semipiano dei due generati da rbc, b e x egualmente rispetto
a rac, e c e x rispetto a rab, il punto è interno.

Ciao,
marmi

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.