有人用过paintbox画数据曲线吗?
这个控件的起点总在左上角开始,怎么处理到左下角开始?
lineto()里的参数是整型,怎么画实型数据?
数据曲线怎么以一定刻度画出来?像chart控件一样的刻度
[解决办法]
1.PaintBox1.Canvas.MoveTo(0,PaintBox1.Height);
2.这是个坐标转换的概念了。比如三点线(10000.01,1)-(10000.02,2)-(10000.03,3),你要每个点减去10000再放大100倍(或>100倍),既有平移又有缩放的概念;
3.曲线经平移及缩放后,就定了上下左右的最大及最小值了,相应的把高或宽n等分后,把线画上即有了刻度。
[解决办法]
unit Unit1;interfaceuses 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.
[解决办法]
不说放大的事了,假设计算出来的坐标是(x,y)
x不用变,y变成 PaintBox1.Canvas.Height-y
[解决办法]
没有直接画曲线的功能,要一个个点描