{*
采用RandG(0,1)来生成标准正态分布数据
1、一次生成10k个数据进行统计,速度相当快(Celeron 1.1G +256M ddr266)<1秒
2、绘出的曲线因为选择范围是8,故看起来并不是十分陡峭,可以将其改为16,那么就更加陡峭了
3、算法:映射到1..1000个数据点,大于等于+8的,正向封顶,设其为1000;小于等于 -8 的,负向封底,设其为1;如上面所说,为了使曲线看起来更加陡峭,可以在这里改为16封顶。其实,我最初是用+2-2来封及+4-4来封定封底的,效果已经不错了。
}
unit Unit1;
{dawnsong,2005-6-22}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Math;
type
TfrmMain = class(TForm)
imgAxis: TImage;
btnRandG: TButton;
GroupBox1: TGroupBox;
Splitter1: TSplitter;
grpControl: TGroupBox;
chkLogFrequency: TCheckBox;
chkDrawEdge: TCheckBox;
chkDrawLines: TCheckBox;
cboxCopyMode: TComboBox;
procedure FormShow(Sender: TObject);
procedure btnRandGClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
totalCount :Integer;
sampleDatas :array[1..1000] of Integer;
procedure DrawAxis;
procedure GaussIt(const ASampleData:Extended);
procedure ReDraw;
procedure DrawEdge;//画边
procedure Log(const logName:string);
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.DrawAxis;
begin
imgAxis.Canvas.Pen.Color :=clLime;
imgAxis.Canvas.Pen.Mode :=pmXor;
imgAxis.Canvas.MoveTo(imgAxis.Width div 2,imgAxis.Height);
imgAxis.Canvas.LineTo(imgAxis.Width div 2,0);
imgAxis.Canvas.MoveTo(0,imgAxis.Height -10);
imgAxis.Canvas.LineTo(imgAxis.Width,imgAxis.Height -10);
end;
procedure TfrmMain.ReDraw;
var
bmp :TBitmap;
i :Integer;
begin//根据数组里面的数和totalCount重新画图
bmp :=TBitmap.Create;
try
bmp.Width :=imgAxis.Width;
bmp.Height:=imgAxis.Height;
bmp.Canvas.Brush.Color :=clBlack;
bmp.Canvas.FillRect(b