代码之家  ›  专栏  ›  技术社区  ›  Paul Sasik

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

  •  10
  • Paul Sasik  · 技术社区  · 14 年前

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

    有时会引发溢出异常。

    对_interpolationPoints数组的检查显示了一些用科学记数法表示的非常大的值,例如{X=0.0y=-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.");
    

    在填充插值点数组的过程中,停止该过程(顺便说一句,float mix/max不起作用。我仍然得到例外。)

    3 回复  |  直到 14 年前
        1
  •  9
  •   Andrew Morton    3 年前

    好吧,我需要知道,所以我进行了增量测试,得出了以下限制:

    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;
    }
    

    我试图将这些数字与.NET原语中的一个值关联起来,但做不到。每个极限都接近2^30的值,但并不完全在其上。任何其他见解都将不胜感激。

    this article found this

        2
  •  4
  •   hyde Juniar    10 年前

    仅供参考-我遇到这种情况与一个简单的二维图实现。当我在图像上放大太远时,相应的像素位置远离显示区域,导致Graphics.DrawLine抛出溢出异常。所以我很自然地添加了一个检查,以确保值在上面Paul定义的范围内。有趣的是,当Y值太大(但小于1073741951的建议正值)时,结果线从预期的向下绘制(到大于上一合理点的Y像素位置)到向上绘制(到窗口顶部)。

    看起来这里使用了有符号的24位值。

        3
  •  1
  •   msteiger    14 年前

    无论如何,不需要在可见区域之外绘制点。只需确保只有两个点都在外面的线才会被丢弃。