Графика GDI+ / Direct2D и размер мира

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

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

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


person GorillaApe    schedule 03.10.2014    source источник
comment
Мне нужна двойная точность. Вроде и автокад работает с такой точностью. Например, некоторые координаты, хранящиеся в файле, имеют вид X: 4355974.24935948.   -  person GorillaApe    schedule 06.10.2014
comment
Вы имеете в виду САПР или ГИС? Для системы САПР необычно поддерживать абсолютные мировые координаты. В любом случае, если это так и проблема связана с недостаточной точностью вычислений с плавающей запятой, не можете ли вы перевести координаты в локальную систему, чтобы понизить порядок? (т.е. вычтите 4355900 или около того, в зависимости от полезного диапазона, чтобы уменьшить количество значащих цифр.)   -  person Yves Daoust    schedule 10.10.2014
comment
Нет, и GDI+, и Direct2D строго работают с плавающей запятой одинарной точности. Вам придется решить эту проблему, уделяя больше внимания своей проекции, держитесь подальше от полюсов с большим отрывом :)   -  person Hans Passant    schedule 11.10.2014


Ответы (2)


Возможно, эта библиотека может помочь в ваших усилиях по портированию:

https://github.com/NetTopologySuite/NetTopologySuite

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

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

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

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

person Eric Acevedo    schedule 11.10.2014

И GDI+, и Direct2D используют числа с плавающей запятой.

Графические карты, поддерживающие удвоение, существуют но вы не можете НЕ использовать это через GDI+ или Direct2D

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

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

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

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

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

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

person Emond Erno    schedule 11.10.2014