2011-09-07 60 views
2

我有两个Point结构,我需要根据这些点绘制I型光束,其中每个点表示I型光束任一侧的横截面。端盖的宽度应该是固定的和任意的。基于两点绘制I型光束

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

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

Example of an I-Beam

+0

请描述的方式,人们不熟悉你的问题与你正在尝试做什么可以理解它。 –

+0

I-Beam,像字母I一样。参见http://bit.ly/odjXNT。或谷歌图像搜索I-Beam。我已经有了中间线(从两点,每一端都有)。我需要画另外两条线。 –

回答

4

你可以尝试用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)); 

enter image description here

CustomLineCap Class

+0

这工作真棒,并非常可定制。谢谢!这个解决方案是最好的,因为我不需要重新发明轮子,并且可以让GDI计算数学。 –

1

假设一个宽度这就是我光束的I部分的宽度的一半,首先你会发现你画的第一线的斜率。

接下来,您将取斜率的负值倒数,并在两个方向上从长度宽度的Point1中绘制一条线。这就是为什么宽度是你想绘制的宽度的一半。

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

以下是drawing a perpendicular line的数学公式。

+0

我正在尝试这个,但我没有那么寻找数学函数,因为我正在寻求将这些函数转换为真正的代码。例如,使用这些公式,我有时会得到零除错误,我不知道该如何处理。 –

+0

@Moozhe:的确如此。如果从Point1到Point2的直线的斜率为零,则反斜率将为无穷大。这是一个特殊情况(水平线,垂直分量和水平垂直分量,水平分量),你必须处理而不用负的反斜率。 –