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.