Рисование реальных координат - PullRequest
1 голос
/ 12 февраля 2010

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

Спасибо

Adi

Ответы [ 5 ]

4 голосов
/ 12 февраля 2010

В какой-то момент их нужно преобразовать в целые числа, чтобы нарисовать фактические пиксели.

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

Другая возможность состоит в том, чтобы позволить аппаратному обеспечению выполнять большую часть работы - вы можете использовать OpenGL (для одного примера) для рендеринга ваших точек, оставляя их в виде плавающей запятой внутри, и позволяя драйверу / оборудованию решать такие проблемы, как масштабирование и преобразование. в целые числа. Это довольно дорого обходится заранее (изучая достаточно OpenGL, чтобы заставить его делать что-нибудь полезное), но также может иметь довольно существенную отдачу, такую ​​как быстрый аппаратный рендеринг, и облегчает управление некоторыми вещами. например, масштабирование и (если вам это когда-нибудь понадобится) возможность отображать 3D-точки так же легко, как 2D.

Редактировать: (в основном ответ на комментарий): В конечном итоге все сводится к следующему: разрешение экрана ниже, чем разрешение числа с плавающей запятой. Например, экран действительно высокого разрешения может отображать 2048 пикселей по горизонтали - это разрешение 11 бит. Даже число с плавающей запятой одинарной точности имеет точность около 24 бит. Независимо от того, как вы это сделаете, уменьшение 24-битного разрешения до 12-битного разрешения приведет к потере чего-либо - обычно lot .

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

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

2 голосов
/ 12 февраля 2010

Что означают эти float значения? Я предполагаю, что они являются некоторыми координатами. Вам нужно знать две вещи:

  • Исходное разрешение (т. Е. Dpi, при котором эти координаты нарисованы)
  • Диапазон, к которому нужно обратиться

После этого возникает проблема масштабирования точек до подходящих целочисленных координат (в зависимости от разрешения экрана).

Редактировать: Простая формула будет:

X(dst) = X(src) * DPI(dst) / DPI(src)

0 голосов
/ 14 февраля 2010

Вы можете попробовать использовать GDI + вместо GDI, в нем есть функции, использующие координаты с плавающей точкой.

0 голосов
/ 12 февраля 2010

Масштаб. Например, умножьте все интегральные значения на 10. Умножьте значения с плавающей запятой на 10,0, а затем обрежьте или округлите (на ваш выбор). Теперь заговор как обычно.

Это даст вам дополнительную точность в ваших графиках. Просто помните масштабный коэффициент, когда вы смотрите на картинку.

В противном случае перед построением преобразуйте число с плавающей точкой в ​​int.

0 голосов
/ 12 февраля 2010

Вам нужно будет преобразовать их в целые числа, а затем передать их таким функциям, как MoveTo() и LineTo().

...