TA的每日心情 | 奋斗 2020-6-5 22:18 |
---|
签到天数: 22 天 [LV.4]偶尔看看III
|
欢迎您注册加入!这里有您将更精采!
您需要 登录 才可以下载或查看,没有账号?注册
x
第一章 Delphi6图形知识--------------------------------------------------------------------------------
1.1Delphi6简介
Delphi6是国际上流行的大型工具软件,既可以用来开发大型图形设计软件,也可以用来制作
辅助数学教学的课件。本书中所讲的图形算法和相应课件都是用Delphi6设计的,因此在阅读之前
必须掌握相应的Delphi6技术,下面是需要的技术的列表:
1、理解窗口(Form1)和基本组件(如:Panel1,Image1)的使用方法;
2、Integer类型和Float类型之间的互相转换,TPoint的使用;
3、TImage的使用方法;
4、TBitmap的使用方法;
5、TCanvas的函数和属性的使用方法;
6、数学函数,例如:ArcCos(),ArcTan(),ArcTan2(),tan(),sin(),cos(),ArcSec();
在使用delphi6开发软件或者课件的时候,不明白的技术问题,可以通过网上的搜
索引擎搜索相关知识,优秀的搜索引擎如下:
http://www.google.com/
http://www.baidu.com/
搜索关键字:delphi 教程,TCanvas,TBitmap
假如你对TCanvas.Arc()画弧函数不了解,可以直接搜索:".arc(" 或者 ".arc"
在网上有许多好文章,对delphi6图形技术进行了十分详细的说明,而且还是免费的,
因此,学精delphi6十分容易。
运行delphi6后,就可以在屏幕右边看到标题是Form1的窗口,在这个窗口中,你可以随意
添加组件到Form1,设置好组件的属性并编写完程序代码之后,按下F9即可生成".EXE"文件。
用delphi6开发图形软件大致需要经过如下三步:
一、设计程序界面;
二、设置组件属性并且编写程序代码;
三、保存和编译程序。
下面是一个实例:
(1、运行delphi6,在Form1中添加一个Panel1(在Standard组件夹),按照如下格式设置属性:
object Panel1: TPanel
Left = 80
Top = 80
Width = 75
Height = 25
Caption = '单击我!'
TabOrder = 0
end
(2、在它的OnClick事件中写入如下代码:
procedure TForm1.Panel1Click(Sender: TObject);
begin
Form1.Canvas.TextOut(10,50,'这是我的第一个图形设计软件!');
file://Canvas.TextOut()用来在画布上面输出文字,前面两个参数是输出文字的位置(x,y坐标)。
end;
(3、调试完成以后,按下Ctrl+Shift+s保存文件成:Project1.dpr
(4、按下F9键编译程序(创建Project1.exe文件)
1.2计算机绘画技术入门
在delphi6图形绘画技术中,TCanvas是十分重要的!通过Canvas可以在许多组件
的表面进行绘画。
实例1:在Form1窗口输出一行文字:
Form1.Canvas.TextOut(10,50,'这是我的第一个图形设计软件!');
实例2:在Form1窗口输出一行红色的文字(蓝色背景):
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Canvas.Brush.Color:=clblue;//设置蓝色背景
Form1.Canvas.Font.Color:=clred;//设置红色文字
Form1.Canvas.Font.Size:=15;//设置字体大小,可以省略
Form1.Canvas.Font.Name:='新宋体';//设置字体,可以省略
Form1.Canvas.TextOut(10,50,'这是我的第一个图形设计软件!');
end;
Canvas通常是某些组件的属性,但是要想在那些没有Canvas属性的组件表面画图,
就应该按照如下格式编写程序代码:
实例3:在Panel2上面写字
procedure TForm1.Button2Click(Sender: TObject);
var S:TControlCanvas;
begin
s:=TControlCanvas.Create;
s.Control:=Panel2;
file://写文字
s.TextOut(0,0,'这是我的第一个图形设计软件!');
//
s.FreeHandle;
s.Free;
end;
实例4:在Button2表面画图
procedure TForm1.Button3Click(Sender: TObject);
var S:TControlCanvas;
begin
s:=TControlCanvas.Create;
s.Control:=Button2;
file://把Image1中的图像画到Button2
s.Draw(0,0,Image1.Picture.Graphic);
//
s.FreeHandle;
s.Free;
end;
1.3几何图形绘画函数
1.画线段
有两个画线段的函数,在作图中经常被使用:
procedure MoveTo(X, Y: Integer);
procedure LineTo(X, Y: Integer);
MoveTo():把画笔移动到屏幕上的指定位置
LineTo(X,Y):从画笔位置(由PenPos指定)画一条线到指定位置(X,Y),
并把画笔的位置移动到X,Y。
在调用LineTo之前,一般要设置画笔的位置(使用MoveTo函数),默认情况下PenPos
的值是:(0,0)。
2.画圆弧线
函数:Arc(x1,y1,x2,y2,x3,y3,x4,y4 : Integer);
使用Arc函数可以在画布上画一段弧,椭圆由(x1,y1),(x2,y2) 两点所确定的矩形所决
定。(x1,y1),(x2,y2)分别是矩形的对角坐标,椭圆是该矩形的内切椭圆。
看下图,弧的起点是椭圆圆周和椭圆中心与(x3,y3)连线的交点。弧的终点是椭圆圆周
和椭圆中心与(x4,y4)连线的交点,以逆时针方向画弧。
分析:A(x1,y1);C(x2,y2);E(x3,y3);F(x4,y4);
椭圆中心(O.X,O.Y)
代码:
Canvas.Arc(A.Left,A.Top,C.Left,C.Top,
E.Left,E.Top,F.Left,F.Top);
还有一个经常被用来画闭合圆弧的函数:
Chord(x1,y1,x2,yx,x3,y3,x4,y4 : Integer);
Chord函数连接椭圆上的两点,椭圆由(x1,y1),
(x2,y3) 两点所确定的矩形决定,(x3,y3)是
始点,(x4,y4)是终点。
3.画椭圆
函数:Ellips(x1,y1,x2,y2 : Integer);
Ellips函数在画布指定的矩形边界上画一个椭圆,(x1,y1)是矩形左上角的坐标,
x2,y2是矩形右下角的坐标。
4.画多边形
函数:Polygon(Points : array of TPrint);
Polygon方法在画布上绘制一系列的点,各点依次连成线,最后将首尾两点
相接形成一个区域,并用当前笔刷填充此区域。
5.画不闭合的多边形
函数:Polyline(Ports : array of TPort);
Polyline函数在画布上用当前画笔绘制一系列的点,各点依次连成线。
TCanvas有一个Brush属性,只要把Brush.style设置成bsclear,那么调用画图函数
(Polygon()、Ellips()等)画出来的几何图形,就只显示图形的边框,例如:
procedure TForm1.Button1Click(Sender: TObject);
begin
with Image1.Picture.Bitmap do
begin
Width:=200;
Height:=200;
Canvas.Brush.Color:=clsilver;
Canvas.FillRect(rect(0,0,200,200));
Canvas.Brush.Color:=clyellow;
Canvas.Brush.Style:=bsclear;
Canvas.Rectangle(10,10,50,50);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with Image1.Picture.Bitmap do
begin
Width:=200;
Height:=200;
Canvas.Brush.Color:=clsilver;
Canvas.FillRect(rect(0,0,200,200));
Canvas.Brush.Color:=clyellow;
Canvas.Brush.Style:=bssolid;
Canvas.Rectangle(10,10,50,50);
end;
end;
1.4图像文件的制作
Delphi6支持位图的显示和制作,位图是指:以".bmp"为扩展名的图像文件。
TBitmap也有一个Canvas属性,通过TBitmap.Canvas就可以在位图表面绘画。
实例5:创建TBitmap
procedure TForm1.FormCreate(Sender: TObject);
var bmp: TBitmap;
begin
file://必须步骤1:创建位图
bmp := TBitmap.Create;
file://必须步骤2:设置位图的宽度和高度
bmp.Width:=Image1.Width;
bmp.Height:=Image1.Height;
file://必须步骤3:调用Canvas中的绘画函数在空白的位图上面画画或者写字
bmp.Canvas.Draw(0,0,Image1.Picture.Graphic);
file://必须步骤4:保存位图或者赋给Image1(或者其它组件的图形属性)
Image1.Picture.Bitmap:=bmp;
file://必须步骤5:释放位图占用的内存空间
bmp.free;
end;
实例6:下面的函数的功能:在窗口Form1的指定区域画图
procedure Form1.DrawBitmap(const Filename: String; const x,y: Integer);
var
Bmp: TBitmap;
begin
if not FileExists(Filename) then
begin
ShowMessage('没有找到"' + Filename + '"位图文件!');
Exit;//退出DrawBitmap()函数,不会执行下面的程序行。
end;
Bmp := TBitmap.Create;
try
Bmp.LoadFromFile(Filename);
file://下面的语句:在窗口Form1上面画Bmp中的图像
Canvas.Draw(x, y, Bmp);//默认情况下,Canvas指的是窗口Form1的Canvas(画布)。
finally
Bmp.Free;
end;
end;
1.5TImage组件
TImage组件用来显示图像文件,例如:*.ico,*.bmp...
这个"图像显示组件"重要的属性如下:
property AutoSize: Boolean;
说明:如果AutoSize=true,那么组件的Width和height都会被自动设置成图像的宽和高。
property Picture: TPicture;
说明:设置这个属性,可以指定显示在组件中的图像。
property Stretch: Boolean;
说明:如果图像的宽高小于组件的宽高,是否拉伸显示图像。
拉伸显示图像会给人一种"缩放图像"的感觉。
property Transparent: Boolean;
说明:设置图像透明色。
如果Transparent=true,且Picture属性中的图像的背景色是白色的,
把TImage组件放到灰色Form1中时,图像中白色的部分自动隐藏。
TImage组件使用实例:
image1.Picture.Graphic.LoadFromFile('d:\1.bmp');//打开并装入图像
image1.Canvas.RoundRect(0,0,50,50,10,10);//在image1上画一个圆角矩形
1.6常用数学函数
函数:function Abs(X);
说明:计算参数X的绝对值。如果X是实型,那么返回实型的值;如果X是整型,
那么返回整型的值。例如:
abs(-45)=45
abs(-1.9)=1.9
abs(8.2)=8.2
abs(-8.2)=8.2
abs(45)=45
函数:function Tan(const X: Extended): Extended;
说明:计算参数X的正切值。如果x是角度,那么必须转换成为弧度。
1度=PI/180弧度 1弧度=180/PI度
实例:计算45度的正切,45度=45*(PI/180)弧度=0.785398163397448弧度。
VAR I:Extended;
begin
i:=tan(45*(PI/180));
showmessage('Tan(45度)='+floattostr(i));
end;
函数:function ArcTan(X: Extended): Extended;
说明:计算参数X的反正切值。
实例:
procedure TForm1.Label5Click(Sender: TObject);
VAR I:Extended;
begin
i:=tan(45*(PI/180));
showmessage('Tan(45度)='+floattostr(i));
showmessage('问:多少度的正切值等于1?'+#13+'答:'+floattostr(arctan(I)*180/PI)+'度');
end;
结果显示如下:
---------------------------
Tan(45度)=1
---------------------------
问:多少度的正切值等于1?
答:45度
---------------------------
函数:function Frac(X: Extended): Extended;
说明:返回X的小数点右边的部分。
实例:showmessage(floattostr(frac(5.2)));//显示:0.2
函数:function FloatToStr(Value: Extended): string;
说明:把浮点数转换成字符串
实例:FloatToStr(-5.6)='-5.6'
FloatToStr(-5.0)='-5'
函数:function StrToFloat(const S: string): Extended;
说明:把数字字符串转换成浮点数
实例:StrToFloat('-5.6')=-5.6
StrToFloat('-5')=-5
函数:function InRange(AValue, AMin, AMax:Integer,Int64或Double):Boolean;
说明:测试AValue是否大于等于AMin,小于等于AMax,是的话,返回TRUE
实例:
if InRange(2,1.0,5.0) then
showmessage('2在1-5之间');
函数:function IntPower(const Base: Extended; const Exponent: Integer): Extended;
说明:相当于如下语句:Base^Exponent .'^'代表乘方。
showmessage('5的2次幂等于'+floattostr(IntPower(5,2)));
showmessage('5的2次幂等于'+floattostr(5*5));
函数:function Ldexp(const X: Extended; const P: Integer): Extended;
说明:相当于如下语句:x*(2^p)
实例:showmessage('5*(2^3)等于'+floattostr(Ldexp(5,3)));
函数:function Power(const Base, Exponent: Extended): Extended;
说明:相当于如下语句:Base^Exponent
实例:showmessage('5^3等于'+floattostr(power(5,3.0)));
函数:function Int(X: Extended): Extended;
说明:返回x的整数部分。
实例:showmessage(floattostr(int(5.2)));
上面的语句最好不要写成如下形式:
showmessage(inttostr(int(5.2)));
函数:function ArcTan2(const Y, X: Extended): Extended;
说明:计算线段(0,0)-(p.x,p.y)与x轴的夹角。
实例:
Function CalPointAngle(P:TPoint):Extended;
begin
file://功能:计算线段(0,0)-(p.x,p.y)与x轴的夹角,返回角度
file://返回值:逆时针是负值;顺时针是正值。
result:=arctan2(p.Y,p.X)*(180/pi);//乘以(180/pi)可以把弧度转换成角度。
end; |
|