我有兩個Point結構,我需要根據這些點繪製I型光束,其中每個點表示I型光束任一側的橫截面。端蓋的寬度應該是固定的和任意的。基於兩點繪製I型光束
基本上我需要畫三條線。首先,我將DrawLine(Point1,Point2),然後我需要數學計算出如何在垂直角度上繪製接下來的兩條線,以便它們以Point1和Point2爲中心。
下圖顯示了我需要基於中心線繪製的東西。但是,這條線可以是任何角度。連接線的Point1和Point2可以在2D空間中的任何位置。
我有兩個Point結構,我需要根據這些點繪製I型光束,其中每個點表示I型光束任一側的橫截面。端蓋的寬度應該是固定的和任意的。基於兩點繪製I型光束
基本上我需要畫三條線。首先,我將DrawLine(Point1,Point2),然後我需要數學計算出如何在垂直角度上繪製接下來的兩條線,以便它們以Point1和Point2爲中心。
下圖顯示了我需要基於中心線繪製的東西。但是,這條線可以是任何角度。連接線的Point1和Point2可以在2D空間中的任何位置。
你可以嘗試用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));
這工作真棒,並非常可定製。謝謝!這個解決方案是最好的,因爲我不需要重新發明輪子,並且可以讓GDI計算數學。 –
假設一個寬度這就是我光束的I部分的寬度的一半,首先你會發現你畫的第一線的斜率。
接下來,您將取斜率的負值倒數,並在兩個方向上從長度寬度的Point1中繪製一條線。這就是爲什麼寬度是你想繪製的寬度的一半。
最後你在兩個方向上從長度寬度的點2畫一條線。
以下是drawing a perpendicular line的數學公式。
我正在嘗試這個,但我沒有那麼尋找數學函數,因爲我正在尋求將這些函數轉換爲真正的代碼。例如,使用這些公式,我有時會得到零除錯誤,我不知道該如何處理。 –
@Moozhe:的確如此。如果從Point1到Point2的直線的斜率爲零,則反斜率將爲無窮大。這是一個特殊情況(水平線,垂直分量和水平垂直分量,水平分量),你必須處理而不用負的反斜率。 –
請描述的方式,人們不熟悉你的問題與你正在嘗試做什麼可以理解它。 –
I-Beam,像字母I一樣。參見http://bit.ly/odjXNT。或谷歌圖像搜索I-Beam。我已經有了中間線(從兩點,每一端都有)。我需要畫另外兩條線。 –