2014-10-03 21 views
5

Sto trasferendo un'applicazione CAD legacy a .NET. Le sue esigenze grafiche non sono molto complesse e GDI + con alcune ottimizzazioni ha buone prestazioni se non si fanno cose di fantasia. Tuttavia supporterò anche Direct2D in quanto offre una migliore esperienza e prestazioni.Grafica GDI +/Direct2D e dimensione mondiale

Il mio problema è che le vecchie app supportavano le coordinate Mercator e semplicemente non si adattano al float, quindi i crash dell'applicazione e GDI + non vanno bene con le trasformazioni di traduzione estreme. Vedo che Direct2D utilizza anche float.

Quindi dovrei implementare una matrice personalizzata per questo, al fine di tradurre ecc alle coordinate dello schermo? c'è un'altra soluzione?

+0

Ho bisogno di una precisione doppia. Sembra che anche AutoCAD funzioni con questa precisione. Per esempio alcune coordinate memorizzate nel file sono come X: 4355974.24935948 – GorillaApe

+0

Intendi CAD o GIS?È insolito che un sistema CAD supporti le coordinate assolute del mondo. Ad ogni modo, se questo è il caso e il problema è legato a un'accuratezza a virgola mobile insufficiente, non è possibile tradurre le coordinate in un sistema locale per ridurre l'ordine di grandezza? (ad esempio, sottrarre 4355900. o giù di lì, a seconda dell'intervallo utile, per ridurre il numero di cifre significative.) –

+0

No, sia GDI + che Direct2D funzionano rigorosamente con virgola mobile a precisione singola. Dovrai risolvere questo problema prestando maggiore attenzione alla tua proiezione, tenendoti lontano dai poli con un margine sano :) –

risposta

1

Forse questa libreria può aiutare nei vostri sforzi di porting:

https://github.com/NetTopologySuite/NetTopologySuite

è un porto di JTS (Java Topologia Suite), che include la funzionalità di geometria/gis correlati.

Il progetto GeoAPI.NET (parte di NetTopologySuite) fornisce classi di geometria di base, sistemi di coordinate e altro.

dare un'occhiata una classe questo Coordinate dove i loro campi X, Y e Z sono doppia precisione .:

https://github.com/NetTopologySuite/GeoAPI/blob/master/GeoAPI/Geometries/Coordinate.cs

1

Sia GDI + e Direct2D usano galleggianti.

Graphics Cards that support doubles do exist ma si può NON uso questo attraverso GDI + o Direct2D

vedo un paio di opzioni per caricare di utilizzare GDI +/Direct2D seconda della velocità desiderata e precisione:

  1. Caricare la dati che usano il doppio e la scala/convertiti in float subito dopo il caricamento. Ciò consente di utilizzare tutte le funzionalità di GDI +, Direct2D e qualsiasi libreria correlata per manipolare i modelli (rotazione, ridimensionamento, traduzione, ...) Lo svantaggio è che il modello perde precisione prima delle trasformazioni.

  2. Carica i dati utilizzando il doppio, esegui tutte le manipolazioni utilizzando il doppio e ridimensiona/converti in float appena prima del rendering. Lato negativo: è necessario trovare o scrivere una libreria che utilizzi il doppio per manipolare i dati e non è possibile utilizzare la GPU per le manipolazioni. Positivo: una precisione è mantenuta più a lungo e potrebbe essere cruciale per i tuoi dati.

Vorrei provare prima l'opzione 1 in quanto è più semplice (più programmazione grafica standard). Solo quando la precisione si rivela insufficiente proverei l'opzione 2.

Non ho esperienza con l'utilizzo/programmazione dell'API di precisione doppia, forse qualcun altro lo aggiungerà come risposta.

An interesting discussion on doubles/floats can be found here Sulla base di questa discussione, suggerisco caldamente di provare prima di tutto se è necessaria una doppia precisione, poiché alla fine verrà visualizzata sullo schermo con una precisione unica.

Problemi correlati