以C#形式绘制曲线的X轴和y轴

以C#形式绘制曲线的X轴和y轴,c#,axis-labels,C#,Axis Labels,我对c比较陌生,正试图在c中画一条曲线。我想问的是,是否有任何可能的方法来创建X轴和Y轴,以显示曲线的每个点的坐标。 请在这件事上帮助我,因为我被困在如何执行它 protected override void OnPaint(PaintEventArgs e) { float a = 1, b = 5, c = 1; double x1, x2, x3,x4,x5,x6, y1, y2, y3,y4,y5, delta; delta =

我对c比较陌生,正试图在c中画一条曲线。我想问的是,是否有任何可能的方法来创建X轴和Y轴,以显示曲线的每个点的坐标。 请在这件事上帮助我,因为我被困在如何执行它

protected override void OnPaint(PaintEventArgs e)
    {


        float a = 1, b = 5, c = 1;
        double x1, x2, x3,x4,x5,x6, y1, y2, y3,y4,y5, delta;
        delta = (b * b) - (4 * a * c);

        x1=0;
        y1 = a * (x1 * x1) + (b * (x1)) + c;
        x2 =  3;
        y2 = a * (x2 * x2) + (b * (x2)) + c;
        x3 = - 3;
        y3 = a * (x3 * x3) + (b * (x3)) + c;
        x4 = 5;
        y4 = a * (x4 * x4) + (b * (x4)) + c;
        x5 = -10;
        y5 = a * (x5 * x5) + (b * (x5)) + c;
        int cx1 = Convert.ToInt32(x1);
        int cx2 = Convert.ToInt32(x2);
        int cx3 = Convert.ToInt32(x3);
        int cy1 = Convert.ToInt32(y1);
        int cy2 = Convert.ToInt32(y2);
        int cy3 = Convert.ToInt32(y3);
        int cx4 = Convert.ToInt32(x4);
        int cy4 = Convert.ToInt32(y4);
        int cx5 = Convert.ToInt32(x5);
        int cy5 = Convert.ToInt32(y5);
        Graphics g = e.Graphics;
        int deltaX = 100;
        int deltaY = 100;
        g.TranslateTransform(deltaX, deltaY);
        float factor = 2.5f;
        Matrix m = new Matrix();
        m.Scale(factor, factor);
        g.MultiplyTransform(m);
        Pen aPen = new Pen(Color.Blue, 1);
        Point point1 = new Point(cx1, cy1);
        Point point2 = new Point(cx2, cy2);
        Point point3 = new Point(cx3, cy3);
        Point point4 = new Point(cx4, cy4);
        Point point5 = new Point(cx5, cy5);


        Point[] Points = {  point5, point3, point1,point2,point4 };
        g.DrawCurve(aPen, Points);

也许我误解了你的意思,但听起来你想让你的GDI+图形按窗口大小缩放(也就是说,你想按窗口大小缩放X和Y轴),对吗

这非常简单,您只需决定要在窗口中显示的空间有多大,即,如果要使轴从左上角的0,0变为右下角的512x512,则只需将X轴按512/宽度的因子缩放,将Y轴按512/高度的因子缩放

因此,您可以通过在对象上执行。您需要使用“的”来获得宽度和高度。(常规表单的.Width和.Height属性包括所有边框和标题栏、填充像素等,因此不适合此计算。)

然后,您需要在窗体的事件期间强制执行(当您使窗口变小时,它将不执行此操作,但当您使窗口变大时,则需要执行此操作,否则它将只重新绘制边缘)

另一件值得考虑的事情是打开窗体的属性,重画将更加平滑

因此,假设您想要在512x512“像素”的虚拟空间中工作,其中0,0始终是左上角,512512是右下角。您可以将以下代码添加到OnPaint事件处理程序的顶部:

float scaleX = 512f / ((float)this.ClientSize.Width);
float scaleY = 512f / ((float)this.ClientSize.Height);
e.Graphics.ScaleTransform(scaleX, scaleY);
然后为表单的事件添加一个处理程序,并添加如下内容:

this.Invalidate(true);

这应该可以解决问题。

我感谢你花时间和精力帮助我解决这个问题。虽然我实际上想画X和Y线(示例图片上传),以显示曲线中的坐标点。你对此也有什么想法吗?再次感谢您的帮助。无论绘图操作如何,这种缩放方法都有效<代码>g.绘制曲线(aPen,点)应该继续工作。