在c#中绘制二次方程曲线
Drawing the quadratic equation curve in c#
我是 c# System Draw 的新手,所以请帮助我编写代码。我正在尝试绘制二次方程曲线并使用 "for" 循环来为曲线点 10 个坐标。我已经多次测试过这段代码,但当我启动代码时什么也没有出现。此外,每当我 运行 代码时,我都会收到消息 ArgumentException 未处理,参数对代码“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();
}
不要处理 Graphics
和 Pen
实例 - 你在循环的每一步都这样做。
相反,获取 Pen
的一个实例(请注意,您可以使用全局 Pens.Blue
:)),不要处理它,或者 Graphics
对象。
此外,开始时尝试使用 DrawLine
而不是 DrawCurve
- 它不会为您提供很好的抗锯齿图形,但它更容易。只有在您了解如何正确使用它后,才从 DrawCurve
开始:) 其中一点是您不能仅通过两个点来绘制它,当然 - 您至少需要三个。
DrawCurve
通过所有指定点绘制一条样条曲线。所以实际上,您只能调用一次,使用您预先计算的二次方的所有点。这会给你一个很好的渲染曲线。但是,我不确定它是否真的是一个真正的二次曲线——我不确定 GDI+ 的样条曲线是二次曲线还是(更有可能)三次曲线。无论如何,它不适用于不同曲线的精确渲染。
关键问题是代码处理了 Graphics 对象。在第二次迭代中,图形对象已被释放,对 DrawCurve 的调用将失败。
并且如评论中所述,DrawCurve 方法需要数组中的 3 个点。请参阅 MSDN Page for DrawCurve
的备注
应尽可能减少对笔的所有其他 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
我是 c# System Draw 的新手,所以请帮助我编写代码。我正在尝试绘制二次方程曲线并使用 "for" 循环来为曲线点 10 个坐标。我已经多次测试过这段代码,但当我启动代码时什么也没有出现。此外,每当我 运行 代码时,我都会收到消息 ArgumentException 未处理,参数对代码“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();
}
不要处理 Graphics
和 Pen
实例 - 你在循环的每一步都这样做。
相反,获取 Pen
的一个实例(请注意,您可以使用全局 Pens.Blue
:)),不要处理它,或者 Graphics
对象。
此外,开始时尝试使用 DrawLine
而不是 DrawCurve
- 它不会为您提供很好的抗锯齿图形,但它更容易。只有在您了解如何正确使用它后,才从 DrawCurve
开始:) 其中一点是您不能仅通过两个点来绘制它,当然 - 您至少需要三个。
DrawCurve
通过所有指定点绘制一条样条曲线。所以实际上,您只能调用一次,使用您预先计算的二次方的所有点。这会给你一个很好的渲染曲线。但是,我不确定它是否真的是一个真正的二次曲线——我不确定 GDI+ 的样条曲线是二次曲线还是(更有可能)三次曲线。无论如何,它不适用于不同曲线的精确渲染。
关键问题是代码处理了 Graphics 对象。在第二次迭代中,图形对象已被释放,对 DrawCurve 的调用将失败。
并且如评论中所述,DrawCurve 方法需要数组中的 3 个点。请参阅 MSDN Page for DrawCurve
的备注应尽可能减少对笔的所有其他 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