首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

有人用过paintbox画数据曲线吗?解决方案

2012-03-22 
有人用过paintbox画数据曲线吗?这个控件的起点总在左上角开始,怎么处理到左下角开始?lineto()里的参数是整

有人用过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等分后,把线画上即有了刻度。
[解决办法]

Delphi(Pascal) code
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

[解决办法]
没有直接画曲线的功能,要一个个点描

热点排行