c# - 在 GDI+ 中绘制坐标的硬界限是什么?

标签 c# .net gdi+ drawing limit

我这样渲染插值曲线:

e.Graphics.DrawLines(new Pen(Color.Red), _interpolationPoints.ToArray());

有时会抛出 OverflowException。

检查 _interpolationPoints 数组显示了一些非常大的科学计数值,例如{X = 0.0 Y = -1.985174E+10}

我怀疑 Y = -1.985174E+10 是 GDI+ 无法处理的值。这很好,但是我可以绘制的最大/最小 X 和 Y 值是多少,因此可以限制数据(并警告用户)而不是在绘制期间捕获溢出异常?限制是否记录在案?

例如,我想做这样的事情:

if (yVal < float.MinValue || yval > float.MaxValue) 
      throw new OverflowException("Interpolation value too large to be rendered.");

在填充 _interpolationPoints 数组期间并停止该过程。 (顺便说一句,float mix/max 不起作用。我仍然遇到异常。)

最佳答案

好的,我需要知道所以我进行了增量测试并得出了这些限制:

positive:    1,073,741,951
negative:   -1,073,741,760

我使用的代码看起来像这样:

int lastGoodVal = 0;
for (int i = -1073000000; i > -1073832999; i -= 1)
{
    g.DrawLine(Pens.Blue, new Point(0,0), new Point(0, i));
    lastGoodVal = i;
}

上面的循环是最终测试,步进 1,通过早期测试建立的一系列负值。如您所见,lastGoodVal 包含最后一次成功的绘制迭代,因此是我将用作常量的实际限制。

我试图将这些数字与 .NET 基元中的值相关联,但没有成功。每个限制都接近 2^30 的值,但不完全在它上面。任何其他见解将不胜感激。

我也只用 DrawLine 方法进行了测试。 API 中的其他函数可能存在不同的限制,但我还没有机会探索它。

另外,在完成这个实验之后,我在谷歌上搜索了值 1073741951,我发现了 this article这与我的发现有关。我也是found this在某种 Mono 代码存档中提到了与 float 限制的接近但不完全相关。

关于c# - 在 GDI+ 中绘制坐标的硬界限是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3468495/

相关文章:

c# - 检查玩家是否通过了两个门

c# - 如何使用 GDI+ 更改图像的背景颜色?

C# 将图像加载到 PictureBox 中而不减慢 UI

C# 将位图加载到 PictureBox 中 - 速度慢并且会阻塞 UI ..还有其他选择吗?

c# - 系统.IO.FileLoadException

c# - 使用 for 循环将自定义对象分配给数组?

c# - 来自 wcf 服务的 Silverlight 异常(故障)处理

c# - 每次我引用一个用户配置文件时,EF 都会创建一个新的用户配置文件?

python - 如何将指向 Python cffi 结构的指针转换为 System.IntPtr (.NET)?

c# - 如何在 Asp.Net Web API 上实现 Https/SSL 连接?