2015-02-09 116 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