C# 通过计时器组件在动画模式下将sin(x)/x绘制到PictureBox

C# 通过计时器组件在动画模式下将sin(x)/x绘制到PictureBox,c#,graphics,timer,drawing,picturebox,C#,Graphics,Timer,Drawing,Picturebox,我需要通过定时器组件在动画模式下将sin(x)/x图形绘制到PictureBox中。我的picBox上已经有轴,并且从0开始绘制图形;0我也有一些来自这个论坛的代码,但是我的图形是从右到左绘制的,我需要从左到右绘制。我需要用定时器在动画模式下画它。有人能帮我吗? 以下是我的绘图功能: private void drawStream() { const int scaleX = 35; const int scaleY = 35; Poin

我需要通过定时器组件在动画模式下将sin(x)/x图形绘制到PictureBox中。我的picBox上已经有轴,并且从0开始绘制图形;0我也有一些来自这个论坛的代码,但是我的图形是从右到左绘制的,我需要从左到右绘制。我需要用定时器在动画模式下画它。有人能帮我吗? 以下是我的绘图功能:

private void drawStream()
    {
        const int scaleX = 35;
        const int scaleY = 35;

        Point picBoxTopLeft = new Point(0, 0);
        Point picBoxTopLeftm1 = new Point(-1, 0);          

        int halfX = picBox.Width / 2; 
        int halfY = picBox.Height / 2; 
        Size size = new Size(halfX + 20, picBox.Height);

        Graphics gr = picBox.CreateGraphics();
        gr.TranslateTransform(halfX, halfY);

        gr.ScaleTransform(scaleX, scaleY);

        gr.ResetClip();

        float lastY = (float)Math.Sin(0);
        float y = lastY;
        Pen p = new Pen(Color.Red, 0.015F);
        float stepX = 1F / scaleX; 

        for (float x = 0; x < 15; x += stepX)
        {
            gr.CopyFromScreen(picBox.PointToScreen(picBoxTopLeft), picBoxTopLeftm1, size, CopyPixelOperation.SourceCopy);             
            y = (float)Math.Sin(x);
            gr.DrawLine(p, -stepX, lastY, 0, y);
            lastY = y;                
        } 
    }
private void drawStream()
{
常数int scaleX=35;
常数int scaleY=35;
点picBoxTopLeft=新点(0,0);
点picBoxTopLeftm1=新点(-1,0);
int halfX=picBox.Width/2;
int halfY=皮箱高度/2;
尺寸=新尺寸(半X+20,picBox.高度);
Graphics gr=picBox.CreateGraphics();
gr.TranslateTransform(halfX,halfY);
gr.ScaleTransform(scaleX,scaleY);
gr.ResetClip();
float lastY=(float)Math.Sin(0);
浮动y=整形;
Pen p=新笔(颜色:红色,0.015 F);
浮动步长x=1F/scaleX;
对于(浮动x=0;x<15;x+=stepX)
{
gr.CopyFromScreen(picBox.PointToScreen(picBoxTopLeft)、picBoxTopLeftm1、大小、CopyPixelOperation.SourceCopy);
y=(float)Math.Sin(x);
gr.拉丝(p,-stepX,lastY,0,y);
lastY=y;
} 
}
很多。
顺便说一句,对不起我的英语,我是乌克兰人。

看起来像是这样:

gr.DrawLine(p, -stepX, lastY, 0, y);
将始终从(-stepX,lastY)到(0,y)绘制一条线。在循环过程中,只有这些点的Y坐标会发生变化,这与您想要的不一样

此外,您通过定义为1/35.0f的
stepX
在X方向上前进。这意味着您每整像素步进35次;有点过分。去掉你的
ScaleTransform
,改为缩放你的自变量(x)以获得更合理的频率。您可能还应该增加
振幅
,以获得好看的曲线

我认为您的绘图循环应该更像:

for (int x = 1; x < halfX; x += 1)
{           
  y = (float) amplitude * Math.Sin(x * stepX);
  gr.DrawLine(p, x - 1, lastY, x, y);
  lastY = y;                
}

它看起来像一行:

gr.DrawLine(p, -stepX, lastY, 0, y);
将始终从(-stepX,lastY)到(0,y)绘制一条线。在循环过程中,只有这些点的Y坐标会发生变化,这与您想要的不一样

此外,您通过定义为1/35.0f的
stepX
在X方向上前进。这意味着您每整像素步进35次;有点过分。去掉你的
ScaleTransform
,改为缩放你的自变量(x)以获得更合理的频率。您可能还应该增加
振幅
,以获得好看的曲线

我认为您的绘图循环应该更像:

for (int x = 1; x < halfX; x += 1)
{           
  y = (float) amplitude * Math.Sin(x * stepX);
  gr.DrawLine(p, x - 1, lastY, x, y);
  lastY = y;                
}
1) 从右到左。只需更改for循环

对于(浮动x=0;x<15;x+=stepX)

变成

对于(浮动x=大小.宽度;x>=0;x -=步骤x)

2) 计时器

简单的解决方法就是增加睡眠时间

 for (float x = 0; x < 15; x += stepX)
 Thread.Sleep(500); //draw...
for(浮点x=0;x<15;x+=stepX)
睡眠(500)//画
1)从右向左。只需更改for循环

对于(浮动x=0;x<15;x+=stepX)

变成

对于(浮动x=大小.宽度;x>=0;x -=步骤x)

2) 计时器

简单的解决方法就是增加睡眠时间

 for (float x = 0; x < 15; x += stepX)
 Thread.Sleep(500); //draw...
for(浮点x=0;x<15;x+=stepX)
睡眠(500)//画

好的,我自己花了20分钟来尝试

public Form1()
{
    InitializeComponent();

    _bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    pictureBox1.Image = _bitmap;

    Timer timer = new Timer();
    timer.Tick += new EventHandler(timer_Tick);
    timer.Interval = 10;

    timer.Start();
}

private int x = 0;
void timer_Tick(object sender, EventArgs e)
{
    if(++x < _bitmap.Width)
    {
        int y = _bitmap.Height/2 
                - ((int)(Math.Sin(x * (Math.PI * 2) /  _bitmap.Width) * (_bitmap.Height / 2)));

        //Small rounding error
        if (y > _bitmap.Height - 1)
            y = _bitmap.Height - 1;

        _bitmap.SetPixel(x, y, Color.Black);
    }
    pictureBox1.Image = _bitmap;
}
public Form1()
{
初始化组件();
_位图=新位图(pictureBox1.Width,pictureBox1.Height);
pictureBox1.Image=\u位图;
定时器=新定时器();
timer.Tick+=新事件处理程序(timer\u Tick);
时间间隔=10;
timer.Start();
}
私有整数x=0;
无效计时器勾号(对象发送方,事件参数e)
{
如果(++x<_位图宽度)
{
int y=_bitmap.Height/2
-((int)(Math.Sin(x*(Math.PI*2)/_bitmap.Width)*(_bitmap.Height/2));
//小舍入误差
如果(y>_bitmap.Height-1)
y=_位图高度-1;
_位图.SetPixel(x,y,Color.Black);
}
pictureBox1.Image=\u位图;
}

测试和工作。

好的,我自己花了20分钟来尝试

public Form1()
{
    InitializeComponent();

    _bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    pictureBox1.Image = _bitmap;

    Timer timer = new Timer();
    timer.Tick += new EventHandler(timer_Tick);
    timer.Interval = 10;

    timer.Start();
}

private int x = 0;
void timer_Tick(object sender, EventArgs e)
{
    if(++x < _bitmap.Width)
    {
        int y = _bitmap.Height/2 
                - ((int)(Math.Sin(x * (Math.PI * 2) /  _bitmap.Width) * (_bitmap.Height / 2)));

        //Small rounding error
        if (y > _bitmap.Height - 1)
            y = _bitmap.Height - 1;

        _bitmap.SetPixel(x, y, Color.Black);
    }
    pictureBox1.Image = _bitmap;
}
public Form1()
{
初始化组件();
_位图=新位图(pictureBox1.Width,pictureBox1.Height);
pictureBox1.Image=\u位图;
定时器=新定时器();
timer.Tick+=新事件处理程序(timer\u Tick);
时间间隔=10;
timer.Start();
}
私有整数x=0;
无效计时器勾号(对象发送方,事件参数e)
{
如果(++x<_位图宽度)
{
int y=_bitmap.Height/2
-((int)(Math.Sin(x*(Math.PI*2)/_bitmap.Width)*(_bitmap.Height/2));
//小舍入误差
如果(y>_bitmap.Height-1)
y=_位图高度-1;
_位图.SetPixel(x,y,Color.Black);
}
pictureBox1.Image=\u位图;
}

测试和工作。

你真的应该在
图形上添加点,然后画出来


另外:您不应该创建这样的图形对象。从
位图中获取一个
或使用
绘制
事件提供的一个。

您应该向
图形添加点,然后只绘制它


另外:您不应该创建这样的图形对象。从
位图
中获取一支,或使用
绘制
事件提供的一支。

完成后,请确保弃置
。使用
语句.Thanx将其放入
中,但我使用的是Pen p=新笔(Color.Red,0.015F)。请确保完成后处理好
。使用
语句将其放入
中。Thanx,但我使用它Pen p=new Pen(Color.Red,0.015 f)。-1,线程。睡眠不会将控制返回GUI,实际上,将其锁定。非常感谢,但我需要使用计时器。奇怪,但什么都没有改变,我的图形