2011-09-07 23 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的直線的斜率爲零,則反斜率將爲無窮大。這是一個特殊情況(水平線,垂直分量和水平垂直分量,水平分量),你必須處理而不用負的反斜率。 –