2015-02-09 60 views
2

我對c#系統繪製非常新,所以請在我的代碼上幫助我。我試圖繪製二次方程曲線,並使用「for」循環以便爲曲線點10個座標。我已經多次測試過這段代碼,並且在我啓動代碼時什麼都沒有出現。此外,無論何時我運行代碼,我得到的消息ArgumentException是未處理的,參數是無效的代碼「g.DrawCurve(aPen,Points);」突出顯示。請幫助我解決這個問題,我花了很多時間嘗試修復。在c中繪製二次方程曲線#

{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 

     float a = 10, b = 30, c = 10; 
     double x1, x2, delta, cx1, cx2, y1, y2; 
     int icx1, iy1, icx2, iy2; 
     delta = (b * b) - (4 * a * c); 
     x1 = ((b * (-1)) + Math.Sqrt(delta))/(2 * a); 
     x2 = ((b * (-1)) - Math.Sqrt(delta))/(2 * a); 
     for (int i = (-10); i <= 10; i = i + 1) 
     { 
      cx1 = i * x1; 
      cx2 = i * x2; 
      y1 = (cx1 * cx1 * a) + (cx1 * b) + c; 
      y2 = (cx2 * cx2 * a) + (cx2 * b) + c; 
      icx1 = Convert.ToInt32(cx1); 
      iy1 = Convert.ToInt32(y1); 
      icx2 = Convert.ToInt32(cx2); 
      iy2 = Convert.ToInt32(y2); 


      Graphics g = e.Graphics; 
      Pen aPen = new Pen(Color.Blue, 1); 
      Point point1 = new Point(icx1, iy1); 
      Point point2 = new Point(icx2, iy2); 
      Point[] Points = { point1,point2 }; 
      g.DrawCurve(aPen, Points); 
      aPen.Dispose(); 
      g.Dispose(); 


     } 
+0

開始與畫線與**兩次與固定/常數/未計算出的座標點**。 – DrKoch 2015-02-09 08:02:41

回答

4

,關鍵的問題是代碼部署Graphics對象。在第二次迭代中,Graphics對象已經被處理,並且對DrawCurve的調用將失敗。

而作爲評價提到的,DrawCurve方法需要在陣列中3分。參見下備註上MSDN Page for DrawCurve

所有其他配置要求的筆應減少儘可能防止重新創建這麼多筆。對於圖:我不完全確定你想要做什麼,但如果你想繪製拋物線,你不應該求解二次方程,而應該把x值代入方程。

僞代碼:

for x = -10 to 10 step 3 

    if SavePoint == null 

     x1 = x 
     y1 = a * x1 * x1 + b * x1 + c 

     point1 = TransformToLocalCoordinates(x1, y1) 

    Else 

     point1 = SavePoint 

    End if 

    x2 = x + 1 
    y2 = a * x2 * x2 + b * x2 + c 

    point2 = TransformToLocalCoordinates(x2, y2) 

    x3 = x + 2 
    y3 = a * x3 * x3 + b * x3 + c 

    point3 = TransformToLocalCoordinates(x3, y3) 

    DrawCurve point1, point2, point3 

    SavePoint = point3 

next 
+1

'DrawCurve'還需要至少三個點,所以它甚至在第一個「Dispose」之前失敗。 – Luaan 2015-02-09 08:06:46

+0

@Luaan - 好。我將它添加到我的答案中。謝謝 – 2015-02-09 08:07:58

1

請勿將GraphicsPen實例 - 你這樣做你的週期的每一步。

取而代之,獲得Pen的一個實例(並且請注意,您可以使用全局Pens.Blue :)),並且不要處理它或Graphics對象。

此外,嘗試使用DrawLine而不是DrawCurve作爲開始 - 它不會給你很好的反鋸齒圖形,但它更容易。一旦你明白如何正確使用它,只需從DrawCurve開始:)其中一點是,當你不能通過兩點來繪製時,你至少需要三點。

DrawCurve提請通過所有指定的點樣條曲線。所以實際上,你只能稱它爲一次,所有的點都是你預先計算的二次方。這會給你一個很好的渲染曲線。但是,我不確定它是否真的是一個真正的二次方 - 我不確定GDI +的樣條是二次方還是(更可能)立方。在任何情況下,它都不適用於不同曲線的精確渲染。

+0

你知道這是OP的問題的答案嗎? – Enigmativity 2015-02-09 08:03:44

+0

@Enigmativity好吧,不是完整的答案,當然 - 但修復方程並不是真正的工作,是嗎? :D – Luaan 2015-02-09 08:05:34

+0

我覺得自己很蠢,不知道這一點,非常感謝你的幫助。儘管現在我的曲線看起來像是一束直線在屏幕邊緣疊疊在一起。你對此也有任何想法嗎? – 2015-02-09 08:05:59