PROCEDURE treppe;

VAR

anzStufen, totStufen, anzStufenMax, anzLaeufe, aktuellerLauf:INTEGER;

sHoehe, sLaenge, sBreite,positionX,positionY:REAL;

LaufRichtung:ARRAY[1..20] OF INTEGER;  

LaufStufen:ARRAY[1..20] OF INTEGER; 


gug,x,k,richtung,xmin,xmax:INTEGER;

max:REAL;


PROCEDURE zeichneTreppenlauf(VAR l:INTEGER; VAR posX, posY:REAL);  {zeichnet einen treppenlauf, l gibt die nummer des zu zeichnenden laufs an}

VAR

i:INTEGER;

BEGIN

FOR i:=0 TO (LaufStufen[l]-1) DO BEGIN

PenFore(0,0,0); {schwarz}

MoveTo(posX+LaufRichtung[l]*(i*sLaenge),posY+i*sHoehe);

LineTo(posX+LaufRichtung[l]*(i*sLaenge),posY+(i+1)*sHoehe+sBreite);


PenFore(0,65535,0); {grün}

MoveTo(posX+LaufRichtung[l]*(i*sLaenge),posY+(i+1)*sHoehe+sBreite);

LineTo(posX+LaufRichtung[l]*(i*sLaenge+sLaenge),posY+(i+1)*sHoehe+sBreite);


PenFore(65535,0,0); {rot}

MoveTo(posX+LaufRichtung[l]*(i*sLaenge),posY+i*sHoehe+sHoehe);

LineTo(posX+LaufRichtung[l]*(i*sLaenge+sLaenge),posY+i*sHoehe+sHoehe);

END;


IF (LaufRichtung[l]>0) THEN BEGIN {endlinien zeichnen, die bis an den rand gehen}

PenFore(0,65535,0); {grün in gegenrichtung}

MoveTo(posX,posY+sBreite);

LineTo(xmin-sBreite,posY+sBreite);


PenFore(65535,0,0); {rot in laufrichtung}

MoveTo(posX+LaufRichtung[l]*(LaufStufen[l]*sLaenge),posY+LaufStufen[l]*sHoehe);

LineTo(xmax+sBreite,posY+LaufStufen[l]*sHoehe);

END;

IF (LaufRichtung[l]<0) THEN BEGIN

PenFore(0,65535,0); {grün in gegenrichtung}

MoveTo(posX,posY+sBreite);

LineTo(xmax+sBreite,posY+sBreite);


PenFore(65535,0,0); {rot in laufrichtung}

MoveTo(posX+LaufRichtung[l]*(LaufStufen[l]*sLaenge),posY+LaufStufen[l]*sHoehe);

LineTo(xmin-sBreite,posY+LaufStufen[l]*sHoehe);

END;

END;

BEGIN

anzStufenMax:=8; {stufenanzahl zwischen 1 und 10}

anzLaeufe:=7;

anzStufen:=0;      {0 für zufällig!!!!!!!!!!!!!!!!!!!!!!!!!!!!, begrenzung durch StufenMax}

sHoehe:=3;

sLaenge:=6;

sBreite:=15;


aktuellerLauf:=1;

richtung:=-1; {-1 für zugang zum 1.treppenlauf von links, 1 für zugang von rechts}

positionX:=0;

positionY:=0;

totStufen:=0;


FOR k:=1 TO anzLaeufe DO BEGIN    {richtungen und die stufenanzahl der jeweiligen läufe im voraus definieren}

LaufRichtung[k]:=richtung;

richtung:=richtung*(-1);


IF (anzStufen=0) THEN BEGIN   

x:=Random*100;

WHILE (x>anzStufenMax) DO BEGIN

x:=x-anzStufenMax+1;

END;

END;

IF (anzStufen>0) THEN BEGIN

x:=anzStufen;

END;


LaufStufen[k]:=x;

totStufen:=totStufen+LaufStufen[k];

END;


FOR k:=1 TO anzLaeufe DO BEGIN    {äusserster treppenpunkt links min und rechts max berechnen}

positionX:=positionX+LaufRichtung[k]*LaufStufen[k]*sLaenge;

IF (positionX>xmax) THEN BEGIN

xmax:=positionX;   

END;

IF (positionX<xmin) THEN BEGIN

xmin:=positionX;

END;

END;


{für die berechnung der randschnittlinien}

x:=anzLaeufe;

WHILE (x>2) DO BEGIN

x:=x-2;

END;

gug:=x-1; {falls die anzahl der treppenläufe gerade ist gugg1 sonst gugg0 ungerade}



positionX:=0;


IF (LaufRichtung[1]<0) THEN BEGIN    {grundlinie zeichnen da ausnahmefall}

PenFore(0,65535,0); {grün}

MoveTo(positionX,positionY);

LineTo(xmin-sBreite,positionY);

END;

IF (LaufRichtung[1]>0) THEN BEGIN

PenFore(0,65535,0); {grün}

MoveTo(positionX,positionY);

LineTo(xmax+sBreite,positionY);

END;


FOR k:=1 TO anzLaeufe DO BEGIN {Treppenläufe nacheinander zeichnen}

zeichneTreppenlauf(aktuellerLauf,positionX,positionY);

positionX:=positionX+LaufRichtung[k]*(LaufStufen[k]*sLaenge);

positionY:=positionY+LaufStufen[k]*sHoehe+sBreite;

aktuellerLauf:=aktuellerLauf+1;

END;



IF (LaufRichtung[anzLaeufe]<0) THEN BEGIN {endlinien zeichnen da ausnahmefall}

PenFore(0,65535,0); {grün}

MoveTo(positionX,positionY);

LineTo(xmin-sBreite,positionY);


IF (gug=0) THEN BEGIN

PenFore(0,0,0); {schwarz}

LineTo(xmin-sBreite,positionY-totStufen*sHoehe-anzLaeufe*sBreite);


MoveTo(xmax+sBreite,sBreite);

LineTo(xmax+sBreite,(anzLaeufe)*sBreite+(totStufen-LaufStufen[anzLaeufe])*sHoehe);

END;

IF (gug=1) THEN BEGIN

PenFore(0,0,0); {schwarz}

LineTo(xmin-sBreite,positionY-totStufen*sHoehe-(anzLaeufe-1)*sBreite);


MoveTo(xmax+sBreite,0);

LineTo(xmax+sBreite,anzLaeufe*sBreite+(totStufen-LaufStufen[anzLaeufe])*sHoehe);

END;

END;


IF (LaufRichtung[anzLaeufe]>0) THEN BEGIN

PenFore(0,65535,0); {grün}

MoveTo(positionX,positionY);

LineTo(xmax+sBreite,positionY);


IF (gug=0) THEN BEGIN

PenFore(0,0,0); {schwarz}

LineTo(xmax+sBreite,positionY-totStufen*sHoehe-anzLaeufe*sBreite);


MoveTo(xmin-sBreite,sBreite);

LineTo(xmin-sBreite,(anzLaeufe)*sBreite+(totStufen-LaufStufen[anzLaeufe])*sHoehe);

END;

IF (gug=1) THEN BEGIN

PenFore(0,0,0); {schwarz}

LineTo(xmax+sBreite,positionY-totStufen*sHoehe-(anzLaeufe-1)*sBreite);


MoveTo(xmin-sBreite,0);

LineTo(xmin-sBreite,anzLaeufe*sBreite+(totStufen-LaufStufen[anzLaeufe])*sHoehe);

END;

END;

PenFore(0,65535,0); {grün} {endlinien zeichnen da ausnahmefall}

MoveTo(xmin-sBreite,anzLaeufe*sBreite);

LineTo(xmin-4*sBreite,anzLaeufe*sBreite);


PenFore(0,65535,0); {grün}

MoveTo(xmax+sBreite,anzLaeufe*sBreite);

LineTo(xmax+4*sBreite,anzLaeufe*sBreite);


END;

RUN(treppe);

This website has been archived and is no longer maintained.