巨大的WPF视觉效果的不精确呈现-有解决方案吗?

问题描述 投票:4回答:2

[在WPF中渲染巨大的视觉效果时,视觉效果会随着坐标的增加而失真,并且会更加失真。我认为这与渲染管道中使用的浮点数据类型有关,但我不确定。无论哪种方式,我都在寻找解决问题的实用方法。

为了演示我在说什么,我创建了一个示例应用程序,该应用程序仅包含嵌入在绘制正弦曲线的ScrollViewer中的自定义控件。

“替代文字”

您可以在这里看到,对于双精度值<= 2 ^ 24(在这种情况下为水平坐标值),图形是正确的,但是从那一点开始,它就变形了。

“替代文字”

失真在2 ^ 25处变得更糟,因此失真每增加一位就继续增加,直到它只绘制了一些垂直线为止。

出于性能原因,我只是绘制图形的可见部分,但出于布局原因,我无法“虚拟化”使该问题过时的控件。我唯一能想到的解决方案是将图形的可见部分绘制为位图,然后在适当的位置渲染位图-但是由于高位值,我又遇到了精度问题,因为我无法准确地放置位图在我需要的位置。

有人知道如何解决这个问题吗?

wpf drawing rendering coordinates precision
2个回答
0
投票

不是WPF的错。

浮点数离零越远,精度就越低-将巨大的数据范围(-Inf,+ Inf)填充到32位(浮点)/ 64位(双精度)数据空间中是一种代价。实际上,浮点数在2 ^ 30左右变得不如整数精确。

64位整数具有恒定的间距(1),但范围从-9,223,372,036,854,775,808到+9,223,372,036,854,775,807。

您还可以考虑使用十进制类型(但是,其值范围也有限)。


0
投票

((更新:哦,没有看到这篇文章的年龄...我想我在堆栈溢出中单击了错误的筛选器按钮...)

相对精度在这里是相关的。因此,仅说“看起来2 ^ 24很好而2 ^ 25不好”是不够的信息。您说这是一种罪过,因此我想y轴的最大值和最小值在这些图片之间永远不变。因此,y轴无关紧要。此外,x步长保持不变,我猜呢?但是,您没有告诉我们选择的正弦周期长度或x步长。这是相关的。当您使用更高的x值时,x尺寸步长的相对精度会变差,因为x步长尺寸相对于x值本身而言变得太小。

c#浮点类型的精度:https://docs.microsoft.com/de-de/dotnet/csharp/language-reference/builtin-types/floating-point-numeric-types

示例:x步长= 1。x = 1(没问题)x = 1000(没问题)x => 2 ^ 23(32位开始出现步长= 1的问题; 64位没有问题)x => 2 ^ 52(64位开始出现步长= 1的问题)

© www.soinside.com 2019 - 2024. All rights reserved.