有人用过paintbox画数据曲线吗?

NoMore 2012-02-01 09:12:34
这个控件的起点总在左上角开始,怎么处理到左下角开始?
lineto()里的参数是整型,怎么画实型数据?
数据曲线怎么以一定刻度画出来?像chart控件一样的刻度
...全文
285 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
NoMore 2012-02-16
  • 打赏
  • 举报
回复
自己画底作为X轴,能根据导入的数据确定等分数,以及间隔,太灵活了,不好确定?
youbuilder 2012-02-10
  • 打赏
  • 举报
回复
没有直接画曲线的功能,要一个个点描
NoMore 2012-02-10
  • 打赏
  • 举报
回复
朋友,实型数据扩大倍数变成整型数据,画出来的图形对头不?
NoMore 2012-02-10
  • 打赏
  • 举报
回复
正在试验自画的刻度怎么与导入进来的数据其中的时间对应,我的时间是0.01S为一间隔画对应数据点;
关于放大的问题我还没有考虑哟。
NoMore 2012-02-10
  • 打赏
  • 举报
回复
呵呵,关于原点和X轴,Y轴,我用的类指针都解决了,谢谢你。
现在的难题是:用paintbox画坐标轴x轴和Y轴,等分刻度点,很难确定;
是否与pb的高和宽有关呢?我正在试验着;
与chart控件的X轴和Y轴一样的能自动适应接收数据多少,刻度随着变化,以100或1000为等分点;
你有好方法咋们可以讨论,最终分都给你,谢谢了。
erhan 2012-02-08
  • 打赏
  • 举报
回复
不说放大的事了,假设计算出来的坐标是(x,y)

x不用变,y变成 PaintBox1.Canvas.Height-y
NoMore 2012-02-08
  • 打赏
  • 举报
回复
谢谢了。
但是,我想把paintbox的左下角做成坐标原点,把底边做成X轴,高做成Y轴,画曲线,怎么都实现不了,你能说说嘛?
erhan 2012-02-04
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
pb1: TPaintBox;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
procedure mPaint();
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.mPaint();
var
mRect: TRect;
i: integer;
radian: real;
mPoint: Array[1..720] of TPoint;
begin
pb1.Canvas.Brush.Color := clWhite;
pb1.Canvas.Brush.Style := bsSolid;
mRect.Left := 0;
mRect.Top := 0;
mRect.Right := pb1.Height;
mRect.Bottom := pb1.Width;
pb1.Canvas.FillRect(mRect);

pb1.Canvas.Pen.Color := clBlack;
pb1.Canvas.Pen.Style := psDash;
pb1.Canvas.Pen.Width := 1;
pb1.Canvas.Rectangle(mRect);
//画刻度
for i:= 1 to 9 do
begin
pb1.Canvas.MoveTo(i*40,0);
pb1.Canvas.LineTo(i*40,400);
pb1.Canvas.MoveTo(0,i*40);
pb1.Canvas.LineTo(400,i*40);
end;

pb1.Canvas.Pen.Style := psSolid;
pb1.Canvas.Pen.Width := 2;
pb1.Canvas.Pen.Color := clRed;
pb1.Canvas.MoveTo( Round(Sin(Pi/180))*150 +200,Round(Cos(Pi/180))*150 +200 );
for i := 1 to 360 do
begin
radian := i * (Pi/180);
//用LineTo的方式画圆
pb1.Canvas.LineTo(200+Round(Sin(radian) * 150), 200+Round(Cos(radian) * 150));
//准备一个正弦多边形数据
mPoint[i].X := i+20;
mPoint[i].Y := 200+Round(Sin(radian) * 100);
mPoint[721-i].X := i+20;
mPoint[721-i].Y := 200-Round(Sin(radian) * 100);
end;
pb1.Canvas.Pen.Color := clBlue;
pb1.Canvas.Brush.Color := clYellow;
pb1.Canvas.Brush.Style := bsDiagCross;
//画一个带填充的多边形
pb1.Canvas.Polygon(mPoint);

//画一个缩小及平移的多段线
for i:= 1 to 720 do
begin
mPoint[i].X := (mPoint[i].X div 2) + 40;
mPoint[i].Y := (mPoint[i].Y div 2) + 40;
end;
pb1.Canvas.Pen.Color := RGB(222,0,222);
pb1.Canvas.Polyline(mPoint);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
pb1.Left := 0;
pb1.Top := 0;
pb1.Height := 400;
pb1.Width := 400;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
mPaint();
end;

end.
NoMore 2012-02-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 erhan 的回复:]
1.PaintBox1.Canvas.MoveTo(0,PaintBox1.Height);
2.这是个坐标转换的概念了。比如三点线(10000.01,1)-(10000.02,2)-(10000.03,3),你要每个点减去10000再放大100倍(或>100倍),既有平移又有缩放的概念;
3.曲线经平移及缩放后,就定了上下左右的最大及最小值了,相应的把高或宽n等分后,把线画上即有了刻度。
[/Quote]


可以给个简单的实例吗?首次应用?不甚感激。
erhan 2012-02-01
  • 打赏
  • 举报
回复
1.PaintBox1.Canvas.MoveTo(0,PaintBox1.Height);
2.这是个坐标转换的概念了。比如三点线(10000.01,1)-(10000.02,2)-(10000.03,3),你要每个点减去10000再放大100倍(或>100倍),既有平移又有缩放的概念;
3.曲线经平移及缩放后,就定了上下左右的最大及最小值了,相应的把高或宽n等分后,把线画上即有了刻度。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧