本履歴

購入した古本の履歴と時々プログラミング

TurboPascal

ボーランド博物館からターボパスカル5.5がフリーダウンロードできる。僕が大学時代使っていたのは6.0なんだけれど、まぁ、オブジェクト指向の機能は5.5からついているので問題ない。っつーわけで、本棚からターボパスカルの書籍をオモムロに取り出し、プログラムを動かしてみたわけなのだっ。
(ちなむに、このPCにはTurbo Pascal for Windows という、Windows3.1用の開発ツールも入っているが、それはまた別の話・・・)

さて、選んだ書籍は、「タオ・オブ・オブジェクト」で、その中でもストレンジアトラクタを表示するプログラムを選んでみた。

さてさて、早速インストロールし、コマンドラインから turbo と打つと、、、
Turbo Pascal5.5
きたーー?!

早速プログラムを打ち込みっ!

program AttractP;

uses crt, graph;

type

BGI = object
GraphDriver : Integer;
GraphMode : Integer;
ErrorCode : Integer;
end;

WindpwPtr = ^Window;
Window = object
X, Y, {point in window}
X1,X2,Y1,Y2 : Integer; {window location}
constructor init(InitX,InitY,
InitWinX1,InitWinX2,
InitWinY1,InitWinY2 : Integer);
destructor Done; virtual;
end;

StateSpacePtr = ^StateSpace;
StateSpace = object (Window)
XPoint, YPoint, {point in space}
SpaceX1,SpaceX2,
SpaceY1,SpaceY2 : real; {boundary of space}
constructor Init(InitX,InitY,InitWinX1,InitWinX2,InitWinY1,InitWinY2 : Integer;
InitXpoint , InitYpoint,Minx,maxx,miny,maxy : real);
procedure Scale; {scale space to window}
destructor Done; virtual;
end;

ModelPtr1 = ^Model1;
Model1 = object(StateSpace)
A, B : real;
constructor Init;
destructor Done; virtual;
procedure Generator; virtual;
end;

ModelPtr2 = ^Model2;
Model2 = object(StateSpace)
R : real;
constructor Init;
destructor Done; virtual;
procedure Generator; virtual;
end;


var
M1 : ModelPtr1;
M2 : ModelPtr2;
G : BGI;

constructor Window.Init(InitX,InitY,InitWinX1,InitWinX2,InitWinY1,InitWinY2:Integer);
begin
X:=InitX;
Y:=InitY;
X1:=InitWinX1;
X2:=InitWinX2;
Y1:=InitWinY1;
Y2:=InitWinY2;
Rectangle(X1,Y1,X2,Y2);
end;

destructor Window.Done;
begin end;

constructor StateSpace.Init(InitX,InitY,InitWinX1,InitWinX2,InitWinY1,InitWinY2 : Integer;
InitXpoint,InitYpoint,Minx,Maxx,Miny,Maxy : real);
begin
Xpoint :=InitXpoint;
Ypoint :=InitYpoint;
SpaceX1:=Minx;
SpaceX2:=Maxx;
SpaceY1:=Miny;
SpaceY2:=Maxy;
Window.Init(InitX,InitY,InitWinX1,InitWinX2,InitWinY1,InitWinY2);
end;

destructor StateSpace.Done;
begin end;

procedure StateSpace.Scale;
begin
if (Xpoint=SpaceX1) then X:=X1;
if (Xpoint=SpaceX2) then X:=X2;
if (Xpoint > SpaceX1) then
X:=round((Xpoint-SpaceX1)/(SpaceY2-SpaceY1)*(X2-X1));
Y:=Y2-(round((Ypoint-SpaceY1)/(SpaceY2-SpaceY1)*(Y2-Y1)));
end;

constructor Model1.Init;
var
LowX,HighX,LowY,HighY : Integer;

begin
LowX:=0;
HighX:= round(GetMaxx/2 - 5);
LowY:=0;
HighY:=round(GetMaxY/2 + 150);

A:=1.4;
B:=0.3;

StateSpace.Init(0,0,LowX,HighX,LowY,HighY,0.4,0,-1.03,1.27,-0.3,0.45);
end;

destructor Model1.Done;
begin end;

constructor Model2.Init;
var
LowX,HighX,LowY,HighY : Integer;
begin
{LowX:=round(GetMaxx/2 + 5);}
LowX:=0;
HighX:=GetMaxx;
LowY:=0;
{HighY:=round(GetMaxy/2 + 150);}
HighY:=GetMaxy;
R:=4.0;

StateSpace.Init(0,1,LowX,HighX,LowY,HighY,0.4,0,-0.5,1.0,-1,0.5);

end;

destructor Model2.Done;
begin end;

procedure Model1.Generator;
var
TempX , TempY : real;
begin
SetViewPort(X1,Y1,X2,Y2,True);
TempX:=Xpoint;
TempY:=Ypoint;
Xpoint:=TempY+1-(A*TempX*TempX);
Ypoint:=B*TempX;
StateSpace.Scale;
PutPixel(X,Y,7);
end;

procedure Model2.Generator;
var
TempX , tempy : real;
begin
SetViewPort(X1,Y1,X2,Y2,True);
Tempx:=Xpoint;
Tempy:=Ypoint;
Ypoint:=Tempx-(1-(Tempy*Tempy));
Xpoint:=R*Tempx*(1-Tempx);
StateSpace.Scale;
putpixel(X,Y,7);
end;


{main}

begin
G.GraphDriver :=Detect;
DetectGraph(G.GraphDriver,G.GraphMode);
InitGraph(G.GraphDriver,G.GraphMode,'');
if GraphResult <> GrOK then Halt(1);

{new(M1,Init);}
new(M2,Init);

repeat
{M1^.Generator;}
M2^.Generator;
until keypressed;
{dispose(M1,done);}
dispose(M2,done);
CloseGraph;
RestoreCRTMode;
end.

チョ速!
Strange Atractor