【问题标题】:Is the behaviour of DrawLine predictable with out of range parameters?如果参数超出范围,DrawLine 的行为是否可以预测?
【发布时间】:2013-03-29 21:46:03
【问题描述】:

DrawLine 可以处理定义区域之外的坐标吗?

例如myGraphics.DrawLine(MyPen, -20, -80, 20, 90);

我希望这能正确生成一条线,就好像它使用了无限画布但只绘制了我的图形中的部分。

我的代码如下。我正在根据数据库中记录的坐标绘制运动。有时,主体移动得比预期的更远,超出了我的位图边缘。我没有检查这种情况,因为我依靠 DrawLine 来处理它。

Bitmap Border = new Bitmap(5000, 5000);
Border.SetResolution(254, 254);

Graphics MyGraphics= Graphics.FromImage(Border);
Pen MyPen = new Pen(Color.Black, 1);


for (Int32 Point = 1; Point <= Points; Point++)
{
   XCoord2 = XCoord1;
   YCoord2 = YCoord1;
   XCoord1 = *READ FROM DATABASE*
   YCoord1 = *READ FROM DATABASE*

   if (Point > 1)
   {
        MyGraphics.DrawLine(MyPen, XCoord1, YCoord1, XCoord2, YCoord2);
   }
}

实际上,我的情节大部分时间都有效。但是,我偶尔会得到一个缺少线条或来自奇怪坐标的模糊线条的图形。

总之,DrawLine 的行为是否可以通过不寻常的参数进行预测。我应该引入一些三角函数来强制绘图始终在我的网格内吗?

【问题讨论】:

  • 除非您使用非常大的坐标(这可能导致溢出或舍入问题),否则我认为您应该没问题。 GDI 有各种视口和窗口支持,这意味着处理这些东西对于实现者来说应该是轻而易举的事。剪裁我从来没有遇到过任何问题。
  • @AshBurlaczenko 正如问题所说“我的情节大部分时间都有效”。我花了几个小时试图找出我偶尔失败的原因。当我扫描我的 1000-2000 坐标时,似乎没有什么不寻常的,这就是我现在怀疑 DrawLine 的原因。我来到这里是希望有人能证实这一点。
  • 所有 GDI+ 绘图都是在内部使用 float 完成的。舍入错误很常见。

标签: c# visual-c#-express-2010


【解决方案1】:

实际限制是十亿个正数或负数,请参阅这个过去的问题(使用 .net)

What are the hard bounds for drawing coordinates in GDI+?

我的猜测是您的数据库拉取错误,如果您使用字符串数据存储并强制对其进行解析,则可能会发生这种情况。

添加一个 thread.sleep() 并让它 Debug.WriteLine 新的拉取(或只是断点的东西),可能有一个值进入那里,要么是奇怪的要么被奇怪地解析

【讨论】:

    【解决方案2】:

    经过更多的实验,我终于解决了我的问题......

    SolidBrush WhiteBrush = new SolidBrush(Color.White);
    myGraphics.FillRectangle(WhiteBrush,0,0,5000,5000);
    

    即在我画任何线条之前,我给了我的图形一个纯白色的背景。在我在 NULL 背景上画一条黑线之前。我不知道为什么这会影响任何事情,但确实如此!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多