在GDI +中绘制坐标的硬边界是什么?

Pau*_*sik 10 .net c# drawing gdi+ limit

我正在渲染插值曲线:

e.Graphics.DrawLines(new Pen(Color.Red), _interpolationPoints.ToArray());
Run Code Online (Sandbox Code Playgroud)

有时会抛出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.");
Run Code Online (Sandbox Code Playgroud)

在_interpolationPoints数组的填充期间停止进程.(浮动混合/最大不能正常工作.我仍然得到例外.)

Pau*_*sik 9

好的,我需要知道,所以我逐步测试并提出了这些限制:

positive:    1,073,741,951
negative:   -1,073,741,760
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

上面的循环是最终测试,步进1,通过早期测试建立的一系列负值.正如您所看到的,lastGoodVal保存了最后一次成功的绘制迭代,因此我将使用它作为常量的实际限制.

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

我也只用DrawLine方法测试过.API中的其他功能可能存在不同的限制,但我还没有机会探索它.

此外,在完成此实验,然后谷歌搜索值1073741951后,我发现了这篇与我的发现相关的文章.我还在某种单声道代码存档中发现了这一点,它提到了与浮动限制相近但不完全相关的.