C# 基于两点绘制工字梁

C# 基于两点绘制工字梁,c#,.net,winforms,gdi+,C#,.net,Winforms,Gdi+,我有两个点结构,我需要基于这些点绘制一个工字梁,其中每个点代表工字梁两侧的横截面。端盖的宽度应固定且任意 基本上我需要画三条线。首先我要画线(点1,点2),然后我需要数学计算出如何画垂直角度的下两条线,使它们位于点1和点2的中心 下图显示了我需要基于中心线绘制的内容。但是,这条线可以是任何角度。连接直线的点1和点2可以位于二维空间中的任何位置 假设宽度为工字梁I部分宽度的一半,首先找到绘制的第一条线的坡度 接下来,取斜率的负倒数,从两个方向上的长宽点1绘制一条直线。这就是为什么宽度是要绘制的宽度

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

基本上我需要画三条线。首先我要画线(点1,点2),然后我需要数学计算出如何画垂直角度的下两条线,使它们位于点1和点2的中心

下图显示了我需要基于中心线绘制的内容。但是,这条线可以是任何角度。连接直线的点1和点2可以位于二维空间中的任何位置


假设宽度为工字梁I部分宽度的一半,首先找到绘制的第一条线的坡度

接下来,取斜率的负倒数,从两个方向上的长宽点1绘制一条直线。这就是为什么宽度是要绘制的宽度的一半

最后,从两个方向的长宽点2画一条线


以下是的数学公式。

您可以尝试使用线条帽:

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


请用一种方式描述你的问题,让不熟悉你的工作的人能够理解。I型梁,如字母I.See。或者谷歌图片搜索I-Beam。我已经有了中间线(从两个点开始画,两端各一个点)。我需要画另外两条线。这非常棒,而且非常可定制。谢谢这个解决方案是最好的,因为我不需要重新发明轮子,并且可以让GDI计算数学。我尝试过这个,但我不是在寻找数学函数,而是在寻找将这些函数转换成真实代码的方法。例如,使用这些公式,我有时会得到被零除的错误,我不知道如何处理这些错误。@Moozhe:True。如果从点1到点2的直线斜率为零,则反向斜率为无穷大。这是一种特殊情况(直线水平,I部分垂直,以及直线垂直,I部分水平),您必须在不采用负反斜率的情况下处理。