2010-10-24 2 views
3

Lors du rendu d'images volumineuses dans WPF, le visuel est déformé et déformé par des coordonnées croissantes. Je suppose que cela a quelque chose à voir avec les types de données à virgule flottante utilisés dans le pipeline de rendu, mais je ne suis pas complètement sûr. De toute façon, je suis à la recherche d'une solution pratique pour résoudre le problème. Pour illustrer ce dont je parle, j'ai créé un exemple d'application qui contient juste un contrôle personnalisé intégré dans un ScrollViewer qui dessine une courbe sinusoïdale.Rendu imprécis des visuels WPF énormes - des solutions?

alt text

Vous pouvez voir ici que le dessin est bien pour les valeurs doubles < = 2^24 (dans ce cas, la valeur de coordonnée horizontale), mais à partir de ce moment-là, il est déformé.

alt text

La distorsion est pire à 2^25 et donc la distorsion continue d'augmenter avec chaque bit supplémentaire jusqu'à ce qu'il tire juste quelques lignes verticales. Pour des raisons de performances, je dessine simplement la partie visible du graphique, mais pour des raisons de mise en page je ne peux pas "virtualiser" le contrôle qui rendrait ce problème obsolète. La seule solution que je pourrais trouver est de dessiner la partie visible du graphe sur un bitmap, puis de restituer le bitmap au bon endroit - mais là j'ai encore le problème de précision avec les grandes valeurs, car je ne peux pas placer correctement le bitmap à la position où j'en ai besoin.

Est-ce que quelqu'un a une idée pour résoudre ce problème?

Répondre

0

Ce n'est pas la faute de WPF.

Les nombres à virgule flottante deviennent de moins en moins précis à mesure qu'ils s'éloignent de zéro - il en coûte de remplir une énorme plage de données (-Inf, + Inf) en 32 bits (float)/64 (double). Les flotteurs deviennent moins précis que les entiers à environ 2^30.

Les entiers 64 bits ont un espacement constant (1), mais ont une plage limitée de -9,223,372,036,854,775,808 à +9,223,372,036,854,775,807.

Vous pouvez également utiliser le type décimal (qui a cependant également une plage de valeurs limitée).

+0

Merci, mais je n'ai jamais dit que c'est la faute de WPF - je suis juste à la recherche d'une solution de contournement. Je suis familier avec le fonctionnement des flottants et des nombres entiers, d'où je suppose que c'est peut-être le problème. J'ai des problèmes de précision à partir de 2^24, et je me souviens d'avoir lu quelque part que le rendu matériel réel se fait en simple précision ... mais passer au logiciel de rendu ne fait pas de différence. Je ne peux pas non plus envisager d'utiliser le type Decimal puisque l'API WPF utilise le double donc c'est ce que je dois faire. –

Questions connexes