2016-08-17 9 views
1

Я работаю над графическим приложением на C++, используя Direct2d (DirectX11). Приложение принимает данные датчика и отображает ввод с использованием прямоугольников, которые размещаются бок о бок по оси x (которая представляет время). Каждый прямоугольник заполняется линейной градиентной щеткой, которая представляет собой несколько показаний датчика на дискретном временном интервале, отображаемом вдоль оси y. Когда считывание получено, размещение начального положения «x» следующего прямоугольника должно быть точно там, где последний закончен, т. Е. Rect1.right должен быть rect2.left. Начальная точка для каждого прямоугольника вычисляется с использованием псевдокода ниже:Direct2D Рисование с DirectX11: выравнивание прямоугольников на графике

//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);