我是c#System Draw的新手,所以请帮我解决我的代码问题。我试图绘制二次方程曲线,并使用" for"循环以便为曲线点10坐标。我已多次测试此代码,并且在启动代码时没有任何内容出现。每当我运行代码时,我得到消息ArgumentException是Unhandled,参数对代码无效" g.DrawCurve(aPen,Points);"突出显示。请帮我解决这个问题,我花了很多天试图修复。
{
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 :(得分:4)
关键问题是代码处理Graphics对象。在第二次迭代中,已经放置了Graphics对象,并且对DrawCurve的调用将失败。
正如评论中所提到的,DrawCurve方法需要数组中的3个点。请参阅MSDN Page for DrawCurve
上的备注应尽可能减少对Pen的所有其他Dispose调用,以防止重新创建如此多的笔。
至于图:我不完全确定你要做什么,但是如果你想绘制一个抛物线,你不应该求解二次方程,而是把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 :(得分:1)
不要处置Graphics
和Pen
个实例 - 你正在循环的每一步都这样做。
相反,获取Pen
的一个实例(并注意您可以使用全局Pens.Blue
:)),并且不要丢弃它或Graphics
对象。
另外,尝试使用DrawLine
代替DrawCurve
作为开始 - 它不会给你很好的抗锯齿图,但它更容易。一旦你理解了如何正确使用它,只能从DrawCurve
开始:)其中一点是你不能仅通过两点来绘制它 - 你需要至少三个。
DrawCurve
在所有指定点绘制样条线。所以实际上,你只能调用它一次,你预先计算出的二次方的所有点。这将为您提供一个很好的渲染曲线。但是,我不确定它是否真的是一个真正的二次方 - 我不确定GDI +的样条是二次的还是(更有可能)立方。在任何情况下,它都不适用于不同曲线的精确渲染。