Рисование Direct2D с помощью DirectX11: выравнивание прямоугольников на графике дисплея
Я работаю над графическим приложением на C++, используя Direct2d (DirectX11). Приложение принимает данные датчика и отображает входные данные, используя прямоугольники, расположенные рядом друг с другом по оси X (которая представляет время). Каждый прямоугольник заполнен кистью с линейным градиентом, которая представляет несколько показаний датчика в дискретном интервале времени, отображаемом вдоль оси Y. Когда считывание получено, размещение начальной позиции "x" следующего прямоугольника должно быть именно там, где закончился последний, то есть rect1.right должно быть rect2.left. Начальная точка для каждого прямоугольника вычисляется с использованием псевдокода ниже:
//find the number of rectangles needed to represent the time scale (rects must be an integer, as we cannot display partial rectangles
int nNumXRects = fAxisLength/fTimeDivision;
//calculate the X-axis increment for each rectangle
float fXIncrement = fXAxisLineLength/(float)NumXRects;
//Get the next x position
rect2.left = rect1.right;
rect2.right = rect2.left + fXIncrement;
Моя проблема в том, что график отображается правильно только тогда, когда значение fXIncrement точно целое число, например 3.0f. Это явно ограничивает длину оси X цифрами, кратными количеству прямоугольников, умноженному на длину каждого прямоугольника. Это влияет на область, доступную для всех других элементов приложения. Если значение инкремента отличается от целого числа, между прямоугольниками появляются маленькие черные линии, которые разрушают внешний вид и затрудняют интерпретацию данных. Я понимаю, почему это происходит в принципе - например, мы не можем отобразить долю пикселя, но как это сделать правильно, чтобы прямоугольники всегда точно совпадали, независимо от длины оси? Казалось бы, Direct2D идеально подходит для этого и должен по-настоящему справляться с точным отображением дробных значений в физические пиксели, но я не знаю, какой правильный подход выходит за рамки нынешнего упрощенного решения, которое заключается в том, чтобы фиксировать длину оси x (то есть я не могу правильно масштабировать, а другим элементам не хватает места по горизонтали).
Любые указатели в правильном направлении будут высоко оценены!
1 ответ
Разве это нельзя исправить, установив соответствующий режим сглаживания при рисовании прямоугольников?
pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);