我这样渲染插值曲线:
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/