2015-11-03 39 views
0

我使用DrawCurve和DrawClosedCurve動用我的PictureBox這樣的曲線:C# - 如何繪製像封閉曲線一樣的開放曲線?

if(isClosed) { 
    g.DrawClosedCurve(
     new Pen(c, lineSize), 
     points, 
     tension, 
     FillMode.Alternate 
    ); 
} else { 
    g.DrawCurve(
     new Pen(c, lineSize), 
     points, 
     tension 
    ); 
} 

的問題是,我想開曲線看起來像閉合曲線,因爲現在,如果我用兩個曲線相同的張力(0.8f),他們是這樣的:

open curve and closed curve

而且我真正想要的是,它看起來像這樣:

enter image description here

我該如何達到這個結果?我需要使用DrawBezier(或DrawBeziers)而不是DrawCurve嗎?如果是,我如何計算使用的控制點?此外,必須使用張力,以便用戶可以繪製不同類型的曲線。

=====編輯=====

我覺得我沒解釋什麼,我想正確的,所以我試圖想在另一個例子......

有這組點:

enter image description here

使用1.2F如緊張,DrawCurve繪製這樣的:

enter image description here

而且DrawClosedCurve這樣的:

enter image description here

現在我意識到,我真的不希望打開的曲線,如閉合曲線可以得出,但我真的想解決的是靠近第一點和最後一點的曲線。

曲線從逆時針運動開始,它們切換到順時針方向運動到下一個點。最後一點也是如此,但它從倒數第二個點開始順時針旋轉,並在下一個點的一半處逆時針切換(這也可以在第一個示例中看到)。所以,在這個例子中,我希望曲線從順時針運動開始,不需要切換到下一個點的中點,而是順時針運動。

但現在我不認爲有這個簡單的解決辦法,因爲我想從DrawCurve上的所有點,但第一和最後的正常行爲......

我相信這仍然可以實現通過使用DrawBezier,但我不知道如何計算具有張力的控制點......

回答

0

使用Graphics.DrawArc

https://msdn.microsoft.com/en-us/library/ms142028(v=vs.110).aspx

「繪製表示由矩形結構指定的橢圓的一部分的圓弧。「

只需設置由startAngle爲0,並sweepAngle至180

+0

這對我來說不起作用,因爲我需要張力,所以,如果用戶使用0.5f作爲張力,它應該仍然作爲橢圓的一部分,當它不應該是這樣的時候... – Thunderbert

+0

@ Thunderbert Sry我誤解了你的問題。通過「不同類型的曲線」你是什麼意思? – 2015-11-03 20:37:12

+0

我的意思是這一切都是由用戶定義,這意味着該點也是從用戶的輸入,而他的用戶想要點的特定羣體,它將標誌着它也將通知緊張,如果它是一個封閉或打開曲線。 – Thunderbert

0

DrawCurve()和DrawClosedCurve()將創建基數樣條,這是一個特殊類型的,其中的切線向量從相鄰點推斷三次Hermite花鍵。如果你想能夠在第一個或最後一個點來指定自己的切向量(或在任何時候),你應該使用更一般的三次Hermite樣條曲線。參見link瞭解更多詳情,您可以三次埃爾米特樣條曲線轉換成三次Bezier曲線如下:

B0 = P0
B1 = P0'/ 3 + B0
B2 = B3 - P1 '/ 3
B3 = P1

其中B0,B1,B2和B3都是三次Bezier曲線,P0控制點' 和P1' 是在點P0和P1的切線矢量。