Неточный рендеринг огромных WPF-изображений - какие-нибудь решения? - PullRequest
4 голосов
/ 24 октября 2010

При рендеринге огромных визуальных изображений в WPF визуальное изображение искажается и более искажается с увеличением координат.Я предполагаю, что это как-то связано с типами данных с плавающей запятой, используемыми в конвейере рендеринга, но я не совсем уверен.В любом случае, я ищу практическое решение для решения проблемы.

Чтобы продемонстрировать, о чем я говорю, я создал пример приложения, которое просто содержит собственный элемент управления, встроенный в ScrollViewer, который рисует синускривая.

alt text

Здесь вы можете видеть, что чертеж в порядке для двойных значений <= 2 ^ 24 (в данном случае значения горизонтальной координаты), но с этой точки на немискажается. </p>

alt text

Искажение усугубляется при 2 ^ 25, и поэтому искажение продолжает увеличиваться с каждым дополнительным битом, пока не будет нарисовано несколько вертикальных линий.* Из соображений производительности я просто рисую видимую часть графика, но из соображений компоновки я не могу «виртуализировать» элемент управления, который сделал бы эту проблему устаревшей.Единственное решение, которое я мог бы придумать, - нарисовать видимую часть графика в растровом изображении, а затем отобразить растровое изображение в соответствующей точке, но там у меня снова возникает проблема точности с большими значениями, поскольку я не могу точно разместить растровое изображениетам, где мне это нужно.

У кого-нибудь есть идеи, как это решить?

1 Ответ

0 голосов
/ 24 октября 2010

Это не вина WPF.

Числа с плавающей запятой становятся все менее и менее точными по мере удаления от нуля - это стоимость заполнения огромного диапазона данных (-Inf, + Inf) в 32 (плавающих) / 64 (двойных) бита пространства данных. На самом деле значения с плавающей точкой становятся менее точными, чем целые числа, около 2 ^ 30.

64-битные целые числа имеют постоянный интервал (1), но имеют ограниченный диапазон от -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807.

Вы также можете использовать десятичный тип (который также имеет ограниченный диапазон значений).

...