c# – 在GDI中绘制坐标的难点是什么?

我正在渲染一个插值曲线:
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不工作btw,我仍然得到例外)

解决方法

好的,我需要知道,所以我逐渐测试,并提出了这些限制:
positive:    1,073,741,951
negative:   -1,760

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

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

上面的循环是最后的测试,通过早期测试建立的一系列负值,逐步上升1.正如你所看到的,lastGoodVal拥有最后一次成功的绘画迭代,因此我将用作一个常数的真正限制.

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

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

另外,在完成了这个实验之后,然后Googling的值为1073741951,我遇到了this article,这与我的发现相关.我也是found this在某种类型的Mono代码存档,它提到了一个接近但与浮动限制的精确相关性.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...