关于画曲线波形(50)

  • 主题发起人 主题发起人 husion
  • 开始时间 开始时间
H

husion

Unregistered / Unconfirmed
GUEST, unregistred user!
我的代码: procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin drawing:=true; if(drawing)then begin paintbox1.Canvas.Pen.Color:=clyellow; if(x>=length(Y_Values))then begin paintbox1.Canvas.MoveTo(Max_Y_Values.x ,Max_Y_Values.y ); paintbox1.Canvas.LineTo(x,y); setlength(Y_Values,x); Max_Y_Values.x:=x; Max_Y_Values.y:=y; end else begin paintbox1.Canvas .moveto(x,Y_Values[x]); paintbox1.Canvas .lineto(x,y); end; end; procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ((X>=0) and (X <=512)) and ((Y>=0) and (Y <=350)) then begin label1.Caption :='X:'+inttostr(x)+' Y:'+inttostr(y); if drawing then begin Y_Values[x]:=y; Timer1.Enabled :=true; end; end; end; procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin 扫描屏幕,并得到整个屏幕的像素点,放在数组Y_Values[x]:=y end; procedure TForm1.Timer1Timer(Sender: TObject); var i:word; begin paintbox1.Refresh; image1.Picture.Bitmap.LoadFromFile('1.bmp');//整个屏幕擦除 paintbox1.Canvas.MoveTo(Zero ,Y_Values[Zero] ); for i:=1 to Max_Y_Values.x do begin paintbox1.Canvas.LineTo(i,Y_Values); end; end; 问题:鼠标移动快,捕捉到的点太少,而且鼠标按下移动过程只能看到很闪的波形,等鼠标停下来的时候,只剩下一个被擦除了的屏幕,没有波形。请高手们提提建议。。。这是实现这个画图的视频http://www.56.com/u65/v_NDUyNjk4OTQ.html
 
先保存图像,要擦掉时重画。
 
to delphi:不明白你的意思,“擦掉时重画”?
 
用双缓冲嘛,在后面一个缓冲画完,再一次性画到屏幕上
 
to lqcros:什么叫双缓冲啊?用不用什么控件,说具体点行吗
 
干吗不用图表空间来实现波形显示,这类控件很多。自己实现的话,保存XY轴的数据序列就行,实现一个队列。不需要的或者过时的数据删除,新的数据入队列。然后根据队列数据重新画图
 
to smsman:你用过这个控件吗?是否可行?
 
在PaintBox1上已经画好一个正弦波形,X轴0-511,Y轴0-355。 现在,我想重绘波形,比如,当鼠标按下(PaintBox1MouseDown)并移动(PaintBox1MouseMove)时,在X轴第100-200位置画了一个三角波波形覆盖原来的正弦波形,当鼠标松开,波形画完。 我实现的方法:先清除X轴第100-200位置原来的正弦波,然后画上三角波形。(这个方法是否可实现) 不知道是不是我的表述不够准确!是这样的,我把实现的例子说一下: 在PaintBox1上已经画好一个正弦波形,X轴0-511,Y轴0-355。 现在,我想重绘波形,比如,当鼠标按下(PaintBox1MouseDown)并移动(PaintBox1MouseMove)时,在X轴第100-200位置画了一个三角波波形覆盖原来的正弦波形,当鼠标松开,波形画完。 我实现的方法:先清除X轴第100-200位置原来的正弦波,然后画上三角波形。(这个方法是否可实现) 现在遇到的问题:不知道如何清除X轴第100-200位置原来的正弦波,并画上三角波!而且这个过程是在鼠标按下并移动时一步完成清除及画波形; 高手们请看看,解决问题了马上给分,如果分还不够,跟我说,我以后凑够了给分,说到做到!
 
http://www.56.com/u65/v_NDUyNjk4OTQ.html上面这个56视频网址是我要做的一个画图软件演示,看了可能会清楚点。
 
555怎么没人回答。。。
 
/borland/demo/teechart 就有自带的例子。chart控件还有好多。Charting with Office Web Components(OWC)也行。你用PaintBox1太麻烦了
 
to smsman: 你有没有看我上面发的56网的视频,teechart 能不能实现这个的功能?
 
这问题很简单啊,只要用三个数组就可以搞掂了,一个数组存正弦波数据,一个数组存三角波数据.按下时,将它们该显示的部份放到第三个数组,然后就是moveto,lineto了.
 
to haha2009:我要的是动态画曲线,这是这个效果http://www.56.com/u65/v_NDUyNjk4OTQ.html
 
1. canvas画图形是要有些编程经验, 不过也不是很复杂;2. 以现在的电脑速度(cpu,显卡,内存等), 实现楼主的功能的速度是没有问题的;3. 我熟悉Delphi图形处理, 但没有仔细研究楼主的代码, 初略看了一下, 有两点建议供楼主参考: 3.1. 楼主用canvas上的点阵来记录数据是不合适的, 应该用矢量(数据量小); 3.2.用timer来完成画面的更新是不合适的;4. 快速显示图像、图形, 除了TForm的doublebuffered外, 更高级一点的可以参考MemoryCanvas;5. 另外: 可以到网络上找找软件示波器相关的代码;
 
我的代码: procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin drawing:=true; if(drawing)then begin paintbox1.Canvas.Pen.Color:=clyellow; if(x>=length(Y_Values))then begin paintbox1.Canvas.MoveTo(Max_Y_Values.x ,Max_Y_Values.y ); paintbox1.Canvas.LineTo(x,y); setlength(Y_Values,x); Max_Y_Values.x:=x; Max_Y_Values.y:=y; end else begin paintbox1.Canvas .moveto(x,Y_Values[x]); paintbox1.Canvas .lineto(x,y); end; end; procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if ((X>=0) and (X <=512)) and ((Y>=0) and (Y <=350)) then begin label1.Caption :='X:'+inttostr(x)+' Y:'+inttostr(y); if drawing then begin Y_Values[x]:=y; Timer1.Enabled :=true; end; end; end; procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin 扫描屏幕,并得到整个屏幕的像素点,放在数组Y_Values[x]:=y end; procedure TForm1.Timer1Timer(Sender: TObject); var i:word; begin paintbox1.Refresh; image1.Picture.Bitmap.LoadFromFile('1.bmp');//整个屏幕擦除 paintbox1.Canvas.MoveTo(Zero ,Y_Values[Zero] ); for i:=1 to Max_Y_Values.x do begin paintbox1.Canvas.LineTo(i,Y_Values); end; end; 问题:鼠标移动快,捕捉到的点太少,而且鼠标按下移动过程只能看到很闪的波形,等鼠标停下来的时候,只剩下一个被擦除了的屏幕,没有波形。请大家提提建议。。。这是实现这个画图的视频http://www.56.com/u65/v_NDUyNjk4OTQ.html
 
to 新世纪:非常感谢回复!
 
“canvas上的点阵来记录数据是不合适的, 应该用矢量(数据量小);”怎么用矢量啊???
 
楼上: 你只要记得你回家的路(矢量)就能回家了, 而没有必要全部记住路周围的所有建筑,花草树木等等(点阵);
 
to 新世纪:"3.1. 楼主用canvas上的点阵来记录数据是不合适的, 应该用矢量(数据量小);" 我用了一个数组Y_Values[x]跟用矢量有什么区别呢?
 

Similar threads

后退
顶部