C# 用拉线C画抛物线#

C# 用拉线C画抛物线#,c#,graph,C#,Graph,晚上好,我知道在网上有类似的问题和一些关于它的教程,但我希望你检查我的代码并更正它。我是说,我想知道我的项目出了什么问题。 我必须画一个抛物线图,在我的主面板上给出它的方程。 我还必须包括两个按钮,放大和缩小,用于缩小和放大“视图”面板的视图(以及抛物线)。 有人建议我使用量表变量。 这是我的代码: 注:x0、y0为面板主x中心、y中心。 我有x,y,用于从方程中确定x,y。 xpc、ypc转换为窗口比例(像素也是如此)。 xmin,xmax是在一定范围内保持在面板上的极值 我希望你能给我一个提

晚上好,我知道在网上有类似的问题和一些关于它的教程,但我希望你检查我的代码并更正它。我是说,我想知道我的项目出了什么问题。 我必须画一个抛物线图,在我的主面板上给出它的方程。 我还必须包括两个按钮,放大和缩小,用于缩小和放大“视图”面板的视图(以及抛物线)。 有人建议我使用量表变量。 这是我的代码:

注:x0、y0为面板主x中心、y中心。
我有x,y,用于从方程中确定x,y。
xpc、ypc转换为窗口比例(像素也是如此)。
xmin,xmax是在一定范围内保持在面板上的极值

我希望你能给我一个提示,谢谢

public void DisegnaParabola()
{
     Graphics gs = panel_main.CreateGraphics();
     pen.Color = Color.Black;     

    scale = (x0*2) / zoom;        //Pixels equivalent to 1x or 1y
    n_punti = (x0*2) / scale;     //Number of x math points that are visible in window
    xmin = -(n_punti / 2);                    
    xmax = n_punti / 2;                          
    precision = 1 / scale;          //Increment of x to have 1px 
    if (asse_parabola.SelectedIndex == 0)   //if Y axis
    {
        for (double i = xmin + precision; i < xmax; i += precision)
        {
            rifx = i - precision;                      //Old points 
            rifxpc = rifx * scale;
            rify = (a * Math.Pow(rifx, 2)) + b * rifx + c;
            rifypc = y0 - (rify * scale);              

            x = i;                                     //New points
            y = (a * Math.Pow(x, 2)) + b * x + c;
            ypc = y0 - (y * scale);

            gs.DrawLine(pen, (float)rifxpc, (float)rifypc, (float)xpc, (float)ypc);
        }
    }
    else
    {
        scale = (y0*2) / zoom;        //Pixels for 1y
        n_punti = (y0*2) / scale;     //Numbers of y in the window
        ymin = -(n_punti / 2);                    
        ymax = n_punti / 2;

        for(double i=ymin+precision; i<ymax; i+=precision)
        {
            rify = y - precision;
            rifypc = (y0*2) - rify * scale;
            rifx = (a * Math.Pow(rify, 2)) + b * rify + c;
            rifxpc = x0 + (rifx * scale);

            y = i;
            x = (a * Math.Pow(y, 2)) + b * y + c;
            xpc = x0 + (x * scale);

            gs.DrawLine(pen, (float)rifypc, (float)rifxpc, (float)ypc, (float)xpc); 
        }

    }

    lbl_canc.Visible = true;


}
公共空间分离抛物线()
{
Graphics gs=panel_main.CreateGraphics();
pen.Color=Color.Black;
比例=(x0*2)/zoom;//相当于1x或1y的像素
n_punti=(x0*2)/scale;//在窗口中可见的x个数学点的数量
xmin=-(n_punti/2);
xmax=n_punti/2;
精度=1/刻度;//x的增量为1px
if(asse_抛物线.SelectedIndex==0)//如果Y轴
{
对于(双i=xmin+精度;i对于(double i=ymin+precision;i你的问题实际上由几个任务组成,像往常一样,关键是把这些任务分开

  • 一个问题是获取数据,我将把细节留给您,但展示如何将其与其他部分分离

  • 下一个问题是缩放数据。我将向您展示如何完全避免这种情况,而是缩放绘图工具

  • 第三个是把它们画到一个显示面上。你会看到,一旦其他问题都解决了,这真的很简单

让我们从最重要的步骤开始:收集数据。您尝试在同一段代码中创建、缩放和绘制所有数据。这有许多缺点

让我们首先以适当的结构收集数据:

List<PointF> points = new List<PointF>();
此方法可确保列表中的所有数据都适合绘图面。如果要将它们限制为不同的大小,可以传入并相应更改代码

最后,我们需要进行实际的绘图。我们应该在绘图表面控件的
Paint
事件中进行绘制

private void panel1_Paint(object sender, PaintEventArgs e)
{
    if (points.Count < 2) return;  // no lines to draw, yet
    ScaleGraphics(e.Graphics, points);
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

    using ( Pen pen = new Pen(Color.Blue )
          { Width = 1.5f , LineJoin = LineJoin.Round, MiterLimit = 1f} )
        e.Graphics.DrawLines(pen, points.ToArray());
}
private void panel 1_Paint(对象发送器,PaintEventArgs e)
{
if(points.Count<2)返回;//还没有要绘制的线
缩放图形(如图形、点);
e、 Graphics.SmoothingMode=SmoothingMode.AntiAlias;
使用(画笔=新画笔(Color.Blue)
{Width=1.5f,LineJoin=LineJoin.Round,MiterLimit=1f})
e、 图形.绘图线(笔,点.ToArray());
}

Graphics gs=panel_main.CreateGraphics();这是第一个错误,因为结果将是非持久性的。请使用其
e.Graphics
对象(此处推荐)绘制绘制事件也不建议使用多个
DrawLine
调用,因为除了宽度为1的不透明笔外,其他任何笔都会使调用看起来不好。收集点,然后使用一个
DrawLine
(复数!)调用更好。我看不到所有类型,但我希望您知道整数除法陷阱…-一旦有结果,您可以向我们显示,就这样做!谢谢!我会尝试,很高兴听到这些新代码为我是的,(抱歉延迟)我终于成功地解决了这个问题。我用DaveLeSee和OnFrand事件绘制了PARABOLL,在应用程序启动时绘制轴。如果(而且只有如果)你对答案很满意,请考虑它。我确信我已经接受了它。如果通过“接受”。你的意思是单击你帖子附近的向上箭头,我已经这样做了。当然,这很有用。不,不是箭头;它们用于向上或向下投票。你需要更多的代表才能做到这一点。箭头下面是一个(不可见)复选标记,你可以通过单击它打开/绿色。。
void ScaleGraphics(Graphics g, List<PointF> data)
{
    float xmax = data.Select(x => x.X).Max();
    float ymax = data.Select(x => x.Y).Max();
    float xmin = data.Select(x => x.X).Min();
    float ymin = data.Select(x => x.Y).Min();

    float width = Math.Abs(xmax - xmin);
    float height = Math.Abs(ymax - ymin);

    var vr = g.VisibleClipBounds;

    g.ScaleTransform(vr.Width / width, vr.Height / height);
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
    if (points.Count < 2) return;  // no lines to draw, yet
    ScaleGraphics(e.Graphics, points);
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

    using ( Pen pen = new Pen(Color.Blue )
          { Width = 1.5f , LineJoin = LineJoin.Round, MiterLimit = 1f} )
        e.Graphics.DrawLines(pen, points.ToArray());
}