2016-08-17 4 views
1

Je travaille sur une application graphique en C++ en utilisant Direct2d (DirectX11). L'application prend en compte les données du capteur et affiche l'entrée en utilisant des rectangles placés côte à côte sur l'axe des x (ce qui représente l'heure). Chaque rectangle est rempli d'une brosse à gradient linéaire qui représente plusieurs lectures de capteur à l'intervalle de temps discret affiché le long de l'axe y. Lorsqu'une lecture est acquise, le placement pour la position de départ du rectangle suivant devrait être exactement là où le dernier rectangle terminé est rect2.left. Le point de départ pour chaque rect est calculée en utilisant le pseudo-code ci-dessous:Dessin Direct2D avec DirectX11: Alignement de rectangles sur un graphique d'affichage

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

Mon problème est que le graphique n'apparaît que correctement lorsque la valeur de fXIncrement est exactement un nombre entier par exemple 3,0f. Ceci limite évidemment la longueur de l'axe X aux chiffres qui sont des multiples du nombre de rectangles, multiplié par la longueur de chaque rectangle. Cela affecte la zone disponible pour tous les autres éléments de l'application. Si la valeur de l'incrément est autre chose qu'un nombre entier, de petites lignes noires apparaissent entre les rectangles, ce qui détruit l'apparence et rend les données beaucoup plus difficiles à interpréter. Je comprends pourquoi cela se passe en principe - nous ne pouvons pas afficher une fraction de pixel par exemple, mais comment cela doit-il être fait correctement pour que les rectangles correspondent toujours exactement, quelle que soit la longueur de l'axe? Il semblerait que Direct2D est parfait pour cela et devrait intrinsèquement faire face à la cartographie des valeurs fractionnaires aux pixels physiques exactement, mais je ne sais pas ce que l'approche correcte est au-delà par la solution simpliste actuelle qui est de garder la longueur de l'axe x fixe (ce qui signifie que je ne peux pas mettre à l'échelle correctement et que les autres éléments n'ont pas assez d'espace à l'horizontale).

Tout pointeur dans la bonne direction serait très apprécié!

Répondre

1

Cela ne peut-il pas être corrigé en définissant le mode anti-alias approprié lors du dessin des rectangles?

pRenderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);