[在WPF中渲染巨大的视觉效果时,视觉效果会随着坐标的增加而失真,并且会更加失真。我认为这与渲染管道中使用的浮点数据类型有关,但我不确定。无论哪种方式,我都在寻找解决问题的实用方法。
为了演示我在说什么,我创建了一个示例应用程序,该应用程序仅包含嵌入在绘制正弦曲线的ScrollViewer中的自定义控件。
您可以在这里看到,对于双精度值<= 2 ^ 24(在这种情况下为水平坐标值),图形是正确的,但是从那一点开始,它就变形了。
失真在2 ^ 25处变得更糟,因此失真每增加一位就继续增加,直到它只绘制了一些垂直线为止。
出于性能原因,我只是绘制图形的可见部分,但出于布局原因,我无法“虚拟化”使该问题过时的控件。我唯一能想到的解决方案是将图形的可见部分绘制为位图,然后在适当的位置渲染位图-但是由于高位值,我又遇到了精度问题,因为我无法准确地放置位图在我需要的位置。
有人知道如何解决这个问题吗?
不是WPF的错。
浮点数离零越远,精度就越低-将巨大的数据范围(-Inf,+ Inf)填充到32位(浮点)/ 64位(双精度)数据空间中是一种代价。实际上,浮点数在2 ^ 30左右变得不如整数精确。
64位整数具有恒定的间距(1),但范围从-9,223,372,036,854,775,808到+9,223,372,036,854,775,807。
您还可以考虑使用十进制类型(但是,其值范围也有限)。
((更新:哦,没有看到这篇文章的年龄...我想我在堆栈溢出中单击了错误的筛选器按钮...)
相对精度在这里是相关的。因此,仅说“看起来2 ^ 24很好而2 ^ 25不好”是不够的信息。您说这是一种罪过,因此我想y轴的最大值和最小值在这些图片之间永远不变。因此,y轴无关紧要。此外,x步长保持不变,我猜呢?但是,您没有告诉我们选择的正弦周期长度或x步长。这是相关的。当您使用更高的x值时,x尺寸步长的相对精度会变差,因为x步长尺寸相对于x值本身而言变得太小。
示例:x步长= 1。x = 1(没问题)x = 1000(没问题)x => 2 ^ 23(32位开始出现步长= 1的问题; 64位没有问题)x => 2 ^ 52(64位开始出现步长= 1的问题)