C# · 12月 27, 2021

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,951negative: -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代码存档,它提到了一个接近但与浮动限制的精确相关性.