2014-10-03 2 views
5

Я переношу устаревшее приложение CAD в .NET. Его графические требования не очень сложны, а GDI + с некоторыми оптимизациями имеет хорошую производительность, если вы не делаете никаких причудливых вещей. Однако я также поддержу Direct2D, так как он предлагает лучший опыт и производительность.Графика GDI +/Direct2D и размер всего мира

Моя проблема в том, что старые приложения поддерживали координаты Меркатора, и они просто не вписываются в float, поэтому сбои приложений и GDI + не идут хорошо с экстремальными трансляционными преобразованиями. Я вижу, что Direct2D также использует поплавки.

Так что я должен реализовать пользовательскую матрицу для этого, чтобы перевести и т.д. на экранные координаты? Есть ли другое решение?

+0

Мне нужна двойная точность. Кажется, что autocad также работает с этой точностью. Например, некоторые координаты, хранящиеся в файле, похожи на X: 4355974.24935948 – GorillaApe

+0

Вы имеете в виду САПР или ГИС?Для системы САПР необычно поддерживать абсолютные мировые координаты. В любом случае, если это так, и проблема связана с недостаточной точностью с плавающей точкой, не можете ли вы перевести координаты в локальную систему, чтобы снизить порядок? (то есть вычесть 4355900 или около того, в зависимости от полезного диапазона, чтобы уменьшить количество значащих цифр.) –

+0

Нет, как GDI +, так и Direct2D строго работают с плавающей точкой с одинарной точностью. Вам придется решить эту проблему, обратив больше внимания на вашу проекцию, держась подальше от полюсов на здоровом расстоянии :) –

ответ

1

Может быть, эта библиотека может помочь в ваших переносящих усилий:

https://github.com/NetTopologySuite/NetTopologySuite

Это порт JTS (Java Топология сюита), которая включает в себя геометрию/ГИС, связанную с функциональностью.

Проект GeoAPI.NET (часть NetTopologySuite) предоставляет базовые классы геометрии, системы координат и многое другое.

гляньте класс это Coordinate где их поля X, Y и Z является двойной точностью .:

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

1

Оба GDI + и Direct2D использовать поплавки.

Graphics Cards that support doubles do exist но вы можете НЕ использовать это через GDI + или Direct2D

Я вижу несколько вариантов загрузки, чтобы использовать GDI +/Direct2D в зависимости от требуемой скорости и точности:

  1. нагрузки на данные с использованием удвоений и масштабирования/конвертирования в float сразу после загрузки. Это позволяет использовать все функции GDI +, Direct2D и любых связанных библиотек для управления моделями (вращение, масштабирование, перевод, ...). Недостатком является то, что модель теряет точность перед преобразованиями.

  2. Загрузите данные с помощью дубликатов, сделайте все манипуляции с использованием парных разрядов и масштабируйте/конвертируйте в поплавки непосредственно перед рендерингом. Недостаток: вам нужно найти или написать библиотеку, которая использует дубликаты для управления данными, и вы не можете использовать графический процессор для манипуляций. Положительный: точность сохраняется дольше и может иметь решающее значение для ваших данных.

Сначала я попробую вариант 1, поскольку это проще (более стандартное графическое программирование). Только когда точность окажется недостаточной, я бы попробовал вариант 2.

У меня нет опыта использования/программирования API с двойной точностью API, возможно, кто-то еще добавит это в качестве ответа.

An interesting discussion on doubles/floats can be found here Основываясь на этом обсуждении, я настоятельно рекомендую вам сначала попытаться выяснить, нужна ли вам двойная точность, поскольку в конце она будет отображаться на экране с единственной точностью.