Útkereszteződés
Készítsük el egy négyes útkereszteződés teljes
lámparendszerének vezérlését. A gépjárműforgalom mind a négy irányból külön
vezérelt legyen, azaz csak az adott irányból közlekedhetnek a járművek. Legyen
egy lámpa a gyalogosoknak, ha ez zöldre vált, akkor gépjárműforgalom egyáltalán
ne legyen, a gyalogosoké az útkereszteződés, minden gyalogos oda és ott megy ahova és ahol akar (régen ilyen volt Debrecenben a Csonka
templomnál).
Programozás-technikai megkötések:
-
Az útkereszteződést grafikusan jelenítsük meg, vízszintes és függőleges
útfelület, felezővonal, gyalogos átkelőhely, járdák, és a kimaradó rész zöld
terület.
-
A látvány a megjelenítő ablaktól részben független legyen, átméretezés után
újrarajzolódjon. Az út, a gyalogos átkelőhely és a járda rögzített szélességű
legyen (konstansként megadott).
-
Hozzunk létre egyetlen objektum-osztályt az öt lámpának (ebből az első négy
háromlencsés, az ötödik kétlencsés);
-
A lámpa objektumok szintén grafikus megjelenésűek, rögzített lencseméret és
lámpaméret mellett (konstansként megadott).
-
A lámpa objektumoknak legyen típusa (1-5) és legyen olyan mezője, mely a
működési fázisát tartalmazza (0-49). A lámpák inicializáló metódusa állítsa be
a működési fázist (az elsőtől az ötödikig csökkenő fázisértékekkel).
-
A lámpákat időzítő üzemeltesse.
A program futási képe az animáció
indítása előtt:
A futási kép animáció közben:
A program listája:
unit UUtket;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type
TfmUtker = class(TForm)
btKilepes: TButton;
tiIdozito: TTimer;
btStart: TButton;
procedure FormCreate(Sender: TObject);
procedure btKilepesClick(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure tiIdozitoTimer(Sender: TObject);
procedure btStartClick(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TLampa=Class
Ft, Fa: Integer;
Procedure Init(It: Integer);
Procedure SetFazis(Ia: Integer);
Function GetFazis: Integer;
Procedure Show;
End;
Const Us=120;
Js=60;
Zs=80;
Cs=14;
Ct=24;
Ls=14;
Lr=12;
var
fmUtker: TfmUtker;
Xk, Yk: Integer;
Lt: Array[1..5] Of TLampa;
Start: Boolean;
implementation
{$R *.dfm}
Procedure TLampa.Init(It: Integer);
Begin
Ft:= It;
End;
Procedure TLampa.SetFazis(Ia: LongInt);
Begin
Fa:= Ia;
End;
Function TLampa.GetFazis: Integer;
Begin
GetFazis:= Fa;
End;
Procedure TLampa.Show;
Begin
With fmUtker.Canvas Do
Begin
With Pen Do
Begin
Color:= clWhite;
Width:= 1;
End;
Brush.Color:= clBlack;
Case Ft Of
1: With Brush Do Begin
Rectangle(Xk-Us-2*Ls,Yk-Us-7*Lr,Xk-Us,Yk-Us);
If Fa In [0..41] Then Color:= clRed Else Color:= clBlack;
Ellipse(Xk-Us-2*Lr-2,Yk-Us-2*Lr-2,Xk-Us-2,Yk-Us -2);
If Fa In [41,49] Then Color:= clYellow Else Color:= clBlack;
Ellipse(Xk-Us-2*Lr-2,Yk-Us-4*Lr-2,Xk-Us-2,Yk-Us-2*Lr-2);
If Fa In [42..48] Then Color:= clGreen Else Color:= clBlack;
Ellipse(Xk-Us-2*Lr-2,Yk-Us-6*Lr-2,Xk-Us-2,Yk-Us-4*Lr-2);
End;
2: With Brush Do Begin
Rectangle(Xk+Us,Yk-Us-2*Ls,Xk+Us+7*Lr,Yk-Us);
If Fa In [0..41] Then Color:= clRed Else Color:= clBlack;
Ellipse(Xk+Us+2, Yk-Us-2*Lr-2,Xk+Us+2*Lr+2,Yk-Us-2);
If Fa In [41,49] Then Color:= clYellow Else Color:= clBlack;
Ellipse(Xk+Us+2*Lr+2,Yk-Us-2*Lr-2,Xk+Us+4*Lr+2,Yk-Us-2);
If Fa In [42..48] Then Color:= clGreen Else Color:= clBlack;
Ellipse(Xk+Us+4*Lr+2,Yk-Us-2*Lr-2,Xk+Us+6*Lr+2,Yk-Us-2);
End;
3: With Brush Do Begin
Rectangle(Xk+Us,Yk+Us,Xk+Us+2*Ls,Yk+Us+7*Lr);
If Fa In [0..41] Then Color:= clRed Else Color:= clBlack;
Ellipse(Xk+Us+2,Yk+Us+2, Xk+Us+2*Lr+2,Yk+Us+2*Lr+2);
If Fa In [41,49] Then Color:= clYellow Else Color:= clBlack;
Ellipse(Xk+Us+2,Yk+Us+2*Lr+2,Xk+Us+2*Lr+2,Yk+Us+4*Lr+2);
If Fa In [42..48] Then Color:= clGreen Else Color:= clBlack;
Ellipse(Xk+Us+2,Yk+Us+4*Lr+2,Xk+Us+2*Lr+2,Yk+Us+6*Lr+2);
End;
4: With Brush Do Begin
Rectangle(Xk-Us-7*Lr,Yk+Us,Xk-Us,Yk+Us+2*Ls);
If Fa In [0..41] Then Color:= clRed Else Color:= clBlack;
Ellipse(Xk-Us-2*Lr-2,Yk+Us+2,Xk-Us-2, Yk+Us+2*Lr+2);
If Fa In [41,49] Then Color:= clYellow Else Color:= clBlack;
Ellipse(Xk-Us-4*Lr-2,Yk+Us+2,Xk-Us-2*Lr-2,Yk+Us+2*Lr+2);
If Fa In [42..48] Then Color:= clGreen Else Color:= clBlack;
Ellipse(Xk-Us-6*Lr-2,Yk+Us+2,Xk-Us-4*Lr-2,Yk+Us+2*Lr+2);
End;
5: With Brush Do Begin
Rectangle(Xk-Ls,Yk-Ls,Xk+Ls,Yk+3*Lr+6);
If Fa In [0..41] Then Color:= clRed Else Color:= clBlack;
Ellipse(Xk-Ls+2,Yk-Ls+2,Xk+Ls-2,Yk+ Ls-2);
If Fa In [42..49] Then Color:= clGreen Else Color:= clBlack;
Ellipse(Xk-Ls+2,Yk+Ls-2,Xk+Ls-2,Yk+3*Ls-6);
End;
End;
End;
End;
procedure TfmUtker.btKilepesClick(Sender: TObject);
begin
Close;
end;
procedure TfmUtker.FormCreate(Sender: TObject);
begin
Xk:= ClientWidth Div 2;
Yk:= ClientHeight Div 2;
Start:= False;
end;
procedure TfmUtker.btStartClick(Sender: TObject);
begin
Start:= True;
end;
procedure TfmUtker.FormPaint(Sender: TObject);
Var I: Word;
begin
With Canvas Do
Begin
Pen.Color:= clBlack;
Brush.Color:= clBtnFace;
Rectangle(0,0,2*Xk-1,2*Yk-1);
MoveTo(0,Yk-Us); LineTo(Xk-Us,Yk-Us); LineTo(Xk-Us,0);
MoveTo(0,Yk+Us); LineTo(Xk-Us,Yk+Us); LineTo(Xk-Us,2*Yk);
MoveTo(2*Xk,Yk-Us); LineTo(Xk+Us,Yk-Us); LineTo(Xk+Us,0);
MoveTo(2*Xk,Yk+Us); LineTo(Xk+Us,Yk+Us); LineTo(Xk+Us,2*Yk);
MoveTo(0,Yk-Us-Js); LineTo(Xk-Us-Js,Yk-Us-Js); LineTo(Xk-Us-Js,0);
MoveTo(0,Yk+Us+Js); LineTo(Xk-Us-Js,Yk+Us+Js); LineTo(Xk-Us-Js,2*Yk);
MoveTo(2*Xk,Yk-Us-Js); LineTo(Xk+Us+Js,Yk-Us-Js); LineTo(Xk+Us+Js,0);
MoveTo(2*Xk,Yk+Us+Js); LineTo(Xk+Us+Js,Yk+Us+Js); LineTo(Xk+Us+Js,2*Yk);
Brush.Color:= clGreen;
FloodFill(10,10,clBlack,fsBorder);
FloodFill(2*Xk-10,10,clBlack,fsBorder);
FloodFill(2*Xk-10,2*Yk-10,clBlack,fsBorder);
FloodFill(10,2*Yk-10,clBlack,fsBorder);
Brush.Color:= RGB(120,120,255);
FloodFill(Xk-Us-Js Div 2,10,clBlack,fsBorder);
FloodFill(Xk+Us+Js Div 2,10,clBlack,fsBorder);
FloodFill(Xk-Us-Js Div 2,Yk+Us+Js Div 2,clBlack,fsBorder);
FloodFill(Xk+Us+Js Div 2,Yk+Us+Js Div 2,clBlack,fsBorder);
Pen.Color:= clWhite;
Brush.Color:= clWhite;
For I:= 0 To (2*Us Div Ct)-1 Do
Begin
Rectangle(Xk-Us+Cs Div 2+I*Ct, Yk-Us-Zs,
Xk-Us+Cs Div 2+I*Ct+Cs,Yk-Us);
Rectangle(Xk-Us+Cs Div 2+I*Ct, Yk+Us,
Xk-Us+Cs Div 2+I*Ct+Cs,Yk+Us+Zs);
End;
For I:= 0 To (2*Us Div Ct)-1 Do
Begin
Rectangle(Xk-Us-Zs,Yk-Us+Cs Div 2+I*Ct,
Xk-Us, Yk-Us+Cs Div 2+I*Ct+Cs);
Rectangle(Xk+Us, Yk-Us+Cs Div 2+I*Ct,
Xk+Us+Zs,Yk-Us+Cs Div 2+I*Ct+Cs);
End;
Pen.Width:= 6;
MoveTo(0,Yk); LineTo(Xk-Us-Zs,Yk); MoveTo(Xk,0); LineTo(Xk,Yk-Us-Zs);
MoveTo(2*Xk,Yk); LineTo(Xk+Us+Zs,Yk); MoveTo(Xk,2*Yk); LineTo(Xk,Yk+Us+Zs);
For I:= 1 To 5 Do
Begin
Lt[I]:= TLampa.Create;
Lt[I].Init(I);
Lt[I].Show;
Lt[I].SetFazis((5-I)*10);
End;
End;
end;
procedure TfmUtker.FormResize(Sender: TObject);
begin
Xk:= ClientWidth Div 2;
Yk:= ClientHeight Div 2;
FormPaint(Sender);
end;
procedure TfmUtker.tiIdozitoTimer(Sender: TObject);
Var I, S: Integer;
begin
If Not Start Then Exit;
For I:= 1 To 5 Do With Lt[I] Do
Begin
S:= GetFazis; Inc(S); S:= S Mod 50; SetFazis(S); Show;
End;
end;
end.