2014-10-03 9 views
5

Przenoszę starszą aplikację CAD do .NET. Wymagania graficzne nie są zbyt skomplikowane, a GDI + z pewnymi optymalizacjami ma dobrą wydajność, o ile nie robisz żadnych wymyślnych rzeczy. Jednak będę obsługiwał Direct2D, ponieważ zapewnia lepsze wrażenia i wydajność.Grafika GDI +/Direct2D i rozmiar światowy

Mój problem polega na tym, że stare współrzędne Mercatora obsługują aplikacje i po prostu nie mieszczą się w float, więc awarie aplikacji i GDI + nie pasują do ekstremalnych transformacji tłumaczeń. Widzę, że Direct2D używa również float.

Czy powinienem zaimplementować do tego celu niestandardową macierz, aby przetłumaczyć itd. Na współrzędne ekranu? Czy jest jakieś inne rozwiązanie?

+0

Potrzebuję podwójnej precyzji. Wygląda na to, że autocad działa również z tą dokładnością. Na przykład niektóre współrzędne przechowywane w pliku są jak X: 4355974.24935948 – GorillaApe

+0

Masz na myśli CAD lub GIS?Nietypowe jest to, że system CAD obsługuje współrzędne absolutne świata. W każdym razie, jeśli tak jest i problem jest związany z niewystarczającą dokładnością zmiennoprzecinkową, czy nie możesz przetłumaczyć współrzędnych na lokalny system, aby obniżyć rząd wielkości? (tj. odejmij 4355900. lub tak, w zależności od użytecznych wartości, aby zmniejszyć liczbę cyfr znaczących.) –

+0

Nie, zarówno GDI +, jak i Direct2D ściśle współpracują z zmiennoprzecinkową pojedynczą precyzją. Będziesz musiał rozwiązać ten problem, zwracając większą uwagę na swoją projekcję, trzymaj się z dala od biegunów zdrowym marginesem :) –

Odpowiedz

1

Może to biblioteka może pomóc w waszych wysiłkach wygładzającym:

https://github.com/NetTopologySuite/NetTopologySuite

Jest to port JTS (Java Topologia Suite), który obejmuje geometria/GIS związanej funkcjonalności.

Projekt GeoAPI.NET (część NetTopologySuite) zapewnia podstawowe klasy geometrii, układy współrzędnych i wiele innych.

spojrzeć klasę to Coordinate gdzie ich polach X, Y i Z są podwójnej precyzji .:

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

1

Zarówno GDI + i Direct2D używać pływaków.

Graphics Cards that support doubles do exist ale można NIE wykorzystanie tego przez GDI + lub Direct2D

widzę kilka opcji, aby załadować w użyciu GDI +/Direct2D w zależności od wymaganej prędkości i precyzji:

  1. załadować dane za pomocą podwójnych i skaluj/konwertuj na pływaki natychmiast po załadowaniu. Pozwala to na wykorzystanie wszystkich funkcji GDI +, Direct2D i wszelkich powiązanych bibliotek do manipulowania modelami (obracanie, skalowanie, tłumaczenie, ...) Wadą jest to, że model traci dokładność przed transformacjami.

  2. Załaduj dane za pomocą podwójnych, wykonaj wszystkie manipulacje za pomocą podwójnych i skaluj/przekonwertuj na obiekty pływające tuż przed renderowaniem. Wada: musisz znaleźć lub napisać bibliotekę, która używa danych podwójnych do manipulowania danymi i nie możesz użyć GPU do manipulacji. Pozytywna: precyzja jest utrzymywana dłużej i może być kluczowa dla danych.

Najpierw wypróbowałbym opcję 1, ponieważ jest to łatwiejsze (bardziej standardowe programowanie grafiki). Tylko wtedy, gdy precyzja okaże się niewystarczająca, wypróbuję opcję 2.

Nie mam doświadczenia w używaniu/programowaniu podwójnej precyzji API, może ktoś inny doda to jako odpowiedź.

An interesting discussion on doubles/floats can be found here w oparciu o tę dyskusję Sugeruję, że najpierw spróbujesz dowiedzieć się, czy potrzebujesz podwójnej precyzji, ponieważ na końcu będzie ona wyświetlana na ekranie z pojedynczą precyzją.