HSG |
|
Die Ampel soll ihren 'Aufhängepunkt' (x/y) jeweils links oben (von der Ampel her gesehen) haben.
Ihre Größe soll über den Radius r der runden Lichter bestimmt werden. Es soll möglich sein, die
Ampel in 4 Orientierungen o zu zeichnen: 0 = SN-Richtung, 1 = OW-Richtung, 2 = NS-Richtung,
3 = WO-Richtung. Die Lichter der Ampel werden über die booleschen Variablen rot, gelb und
gruen gesteuert. Die Ampel wird direkt in die canvas gezeichnet.
Ampelzeichnen.zip
unit uAmpel; interface uses Graphics; // für canvas usw. type TAmpel = class(TObject) private { Private-Deklarationen } public class procedure zeichne_Ampel(canvas : TCanvas; x,y,r,o : integer;rot,gelb,gruen : boolean); class procedure zeichne_kleineAmpel(canvas : TCanvas; x,y,r,o : integer;rot,gruen : boolean); end; implementation const // Ampelfarben grau = $00404040; // XBGR rot_an = $000000FF; rot_aus = $00000055; gelb_an = $0000FFFF; gelb_aus = $00005555; gruen_an = $0000FF00; gruen_aus = $00005500; class procedure TAmpel.zeichne_Ampel(canvas : TCanvas; x,y,r,o : integer;rot,gelb,gruen : boolean); begin with canvas do case o of 0 : begin // Ampelkasten Brush.Color := grau; Rectangle(x,y,x+3*r,y+8*r); // Rot-Licht if rot then Brush.Color := rot_an else Brush.Color := rot_aus; Ellipse(x+round(0.5*r),y+round(0.5*r), x+round(2.5*r),y+round(2.5*r)); // Gelb-Licht if gelb then Brush.Color := gelb_an else Brush.Color := gelb_aus; Ellipse(x+round(0.5*r),y+3*r, x+round(2.5*r),y+5*r); // Grün-Licht if gruen then Brush.Color := gruen_an else Brush.Color := gruen_aus; Ellipse(x+round(0.5*r),y+round(5.5*r), x+round(2.5*r),y+round(7.5*r)); // Stange Brush.Color := grau; Rectangle(x+round(1.25*r),y+8*r,x+round(1.75*r),y+16*r); end; 1 : begin // Ampelkasten Brush.Color := grau; Rectangle(x,y,x+8*r,y-3*r); // Rot-Licht if rot then Brush.Color := rot_an else Brush.Color := rot_aus; Ellipse(x+round(0.5*r),y-round(0.5*r), x+round(2.5*r),y-round(2.5*r)); // Gelb-Licht if gelb then Brush.Color := gelb_an else Brush.Color := gelb_aus; Ellipse(x+3*r,y-round(0.5*r), x+5*r,y-round(2.5*r)); // Grün-Licht if gruen then Brush.Color := gruen_an else Brush.Color := gruen_aus; Ellipse(x+round(5.5*r),y-round(0.5*r), x+round(7.5*r),y-round(2.5*r)); // Stange Brush.Color := grau; Rectangle(x+8*r,y-round(1.25*r),x+16*r,y-round(1.75*r)); end; 2 : begin // Ampelkasten Brush.Color := grau; Rectangle(x-3*r,y,x,y-8*r); // Rot-Licht if rot then Brush.Color := rot_an else Brush.Color := rot_aus; Ellipse(x-round(2.5*r),y-round(0.5*r), x-round(0.5*r),y-round(2.5*r)); // Gelb-Licht if gelb then Brush.Color := gelb_an else Brush.Color := gelb_aus; Ellipse(x-round(2.5*r),y-round(3*r), x-round(0.5*r),y-round(5*r)); // Grün-Licht if gruen then Brush.Color := gruen_an else Brush.Color := gruen_aus; Ellipse(x-round(2.5*r),y-round(5.5*r), x-round(0.5*r),y-round(7.5*r)); // Stange Brush.Color := grau; Rectangle(x-round(1.75*r),y-8*r,x-round(1.25*r),y-16*r); end; 3 : begin // Ampelkasten Brush.Color := grau; Rectangle(x-8*r,y+3*r,x,y); // Rot-Licht if rot then Brush.Color := rot_an else Brush.Color := rot_aus; Ellipse(x-round(2.5*r),y+round(2.5*r), x-round(0.5*r),y+round(0.5*r)); // Gelb-Licht if gelb then Brush.Color := gelb_an else Brush.Color := gelb_aus; Ellipse(x-5*r,y+round(2.5*r), x-3*r,y+round(0.5*r)); // Grün-Licht if gruen then Brush.Color := gruen_an else Brush.Color := gruen_aus; Ellipse(x-round(7.5*r),y+round(2.5*r), x-round(5.5*r),y+round(0.5*r)); // Stange Brush.Color := grau; Rectangle(x-16*r,y+round(1.75*r),x-8*r,y+round(1.25*r)); end; end; // of case end; ....
Die Ampel-Prozeduren sind Klassenmethoden, dh. sie lassen sich ohne Erzeugung einer Instanz von TAmpel nutzen:
.... uses ..., uAmpel; .... procedure TForm1.bAmpelClick(Sender: TObject); var x,y,r,o : integer; rot,gelb,gruen : boolean; begin x := StrToInt(eX.Text); y := StrToInt(eY.Text); r := StrToInt(eR.Text); o := StrToInt(eO.Text); rot := cbRot.Checked; gelb := cbGelb.Checked; gruen := cbGruen.Checked; TAmpel.zeichne_Ampel(canvas,x,y,r,o,rot,gelb,gruen); end; ....