борьба с ошибкой округления в Qt (QPainter)? - PullRequest
0 голосов
/ 26 января 2019

Я рисую простой график свечи со следующей формулой, определяющей центры свечи:

x = width() + i * scale * (candle_width + candle_spacing)

Умножение на i является источником ошибок округления, как вы можете видеть на изображении, чем больше |i|, тем больше усиливается ошибка округления. Центр подсвечника качается вокруг. Я пытался использовать сглаживание, но это только ухудшает изображение. Это особенно заметно при перетаскивании графика свечи (дополнительная функция). Я использую qreal (double) для всех вычислений, кроме i, который имеет тип int, очевидно.

Snapshot

Часть изображения увеличена (8x), чтобы показать проблему:

Part of Snapshot (8x Zoom)

1 Ответ

0 голосов
/ 26 января 2019

Решением было обойти внутреннее округление Qt координат / ширин / высот и сделать это самостоятельно. Я сам округлил центральную точку x, а затем проверял, является ли ширина округленной свечи нечетной / четной. Если оно четное, я добавлю 1, чтобы сделать его нечетным. Это делается для того, чтобы центральная линия всегда находилась в центре свечи. Вот исправленное изображение и некоторый код:

auto const x(qRound(transform(i)));
auto rounded_candle_width(qRound(scaled_candle_width));
rounded_candle_width += !(rounded_candle_width % 2);

enter image description here

...