【问题标题】:Drawing an I-Beam based on two points基于两点绘制工字梁
【发布时间】:2011-11-12 08:32:24
【问题描述】:

我有两个点结构,我需要根据这些点绘制一个工字梁,其中每个点代表工字梁任一侧的横截面。端盖的宽度应该是固定的和任意的。

基本上我需要画三条线。首先我将绘制线(Point1,Point2),然后我需要数学计算出如何在垂直角上绘制接下来的两条线,以便它们以 Point1 和 Point2 为中心。

下图显示了我需要根据中心线绘制的内容。但是,这条线可以是任何角度。连接线的 Point1 和 Point2 可以在 2D 空间中的任何位置。

【问题讨论】:

  • 请以不熟悉您尝试做的事情的人能够理解的方式描述您的问题。
  • 工字梁,如字母 I。见 bit.ly/odjXNT。或者谷歌图片搜索 I-Beam。我已经有了中间线(从两点绘制,两端各一个)。我需要画另外两条线。

标签: c# .net winforms gdi+


【解决方案1】:

您可以尝试使用 LineCaps:

protected void DrawIBeam(Graphics g, Point fromPoint, Point toPoint)
{
  using (GraphicsPath hPath = new GraphicsPath())
  {
    hPath.AddLine(new Point(-5, 0), new Point(5, 0));
    CustomLineCap myCap = new CustomLineCap(null, hPath);
    myCap.SetStrokeCaps(LineCap.Round, LineCap.Round);
    using (Pen myPen = new Pen(Color.Black, 2))
    {
      myPen.CustomStartCap = myCap;
      myPen.CustomEndCap = myCap;
      g.DrawLine(myPen, fromPoint, toPoint);
    }
  }
}

然后调用它:

DrawIBeam(e.Graphics, new Point(10, 10), new Point(60, 60));

来自CustomLineCap Class

【讨论】:

  • 这很棒,而且非常可定制。谢谢!这个解决方案是最好的,因为我不需要重新发明轮子并且可以让 GDI 计算数学。
【解决方案2】:

假设宽度是工字梁的 I 部分宽度的一半,首先你要找到你画的第一条线的斜率。

接下来,取斜率的负数,并从 Point1 开始在两个方向上画一条长宽高的线。这就是为什么宽度是您要绘制的宽度的一半。

最后你从点 2 开始在两个方向上画一条长宽的线。

这是drawing a perpendicular line 的数学公式。

【讨论】:

  • 我正在尝试这个,但我并没有寻找数学函数,而是希望将这些函数转换为实际代码。例如,使用这些公式有时会出现被零除的错误,我不知道如何处理。
  • @Moozhe:是的。如果从 Point1 到 Point2 的直线斜率为零,则反斜率将是无穷大。这是一种特殊情况(水平线,I 部分垂直以及垂直线,I 部分水平),您必须在不采用负反斜率的情况下进行处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
相关资源
最近更新 更多