C# 通过计时器组件在动画模式下将sin(x)/x绘制到PictureBox
我需要通过定时器组件在动画模式下将sin(x)/x图形绘制到PictureBox中。我的picBox上已经有轴,并且从0开始绘制图形;0我也有一些来自这个论坛的代码,但是我的图形是从右到左绘制的,我需要从左到右绘制。我需要用定时器在动画模式下画它。有人能帮我吗? 以下是我的绘图功能: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
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,实际上,将其锁定。非常感谢,但我需要使用计时器。奇怪,但什么都没有改变,我的图形