PROCEDURE lampe; VAR { Parameter } a:INTEGER; {SeitenlŠnge oben} h:INTEGER; {Hšhe} wa:INTEGER; {Drehwinkel -60..60} f:REAL; {Faktor SeitenlŠnge unten} { sonstige variablen } i:INTEGER; l:INTEGER; w:REAL; v:REAL; P:REAL; p0:REAL; q:REAL; q0:REAL; u:REAL; r:REAL; d:REAL; x:REAL; y:REAL; s1:REAL; s2:REAL; s3:REAL; s4:Real; { berechnete punkte } loci:ARRAY[1..15] OF HANDLE; schnitt:ARRAY[1..15] OF INTEGER; BEGIN { aufrŠumen } SelectAll; DeleteObjs; Units(5); { input } a := IntDialog('SeitenlŠnge oben in cm', '10'); h := IntDialog('Hšhe in cm', '20'); wa := AngDialog('Drehwinkel', '60'); f := RealDialog('Vergršsserungsfaktor SeitenlŠnge unten', '1'); { berechnung mit f=1 } p0 := sqrt( h^2 + 2/3 * a^2 * ( 1- cos( Deg2Rad(wa) ) ) ); q0 := sqrt( h^2 + 2/3 * a^2 * ( 1- cos( Deg2Rad(120-wa) ) ) ); r := a/sqrt(3); d := sqrt( h^2 + r^2 ); s3 := (r+d+p0) / 2; p := sqrt( (f*r + d)^2 - 4*f*s3*(s3-p0) ); s4 := (r+d+q0) / 2; q := sqrt( (f*r + d)^2 - 4*f*s4*(s4-q0) ); { winkel mit halbwinkel-satz } s1 := (p+q+a) / 2; v := 180/pi *2 * arccos( sqrt( s1*(s1-a) / (p*q) )); u := 180/pi *2 * arccos( sqrt( s1*(s1-p) / (a*q) )); s2 := (p+q+a*f) / 2; w := 180/pi *2 * arccos( sqrt( s2*(s2- f*a) / (p*q) )); { Begin Konstruktion } { Startpunkt } Locus(0,0); loci[1] := LNewObj; FOR i:=0 TO 3 DO BEGIN { Dreieckspaare setzen } {Ê1. Punkt } Locus(p,0); loci[i*2+2] := LNewObj; { drehen } SetOrigin(p,0); SelectAll; RotatePoint(0,0,v); { 2. Punkt } Locus(-q, 0); loci[i*2+3] := LNewObj; { Deckenpunkt } SetOrigin(-q, 0); SelectAll; RotatePoint(0,0, u+60); Locus(a, 0); loci[10+i] := LNewObj; { zurŸckdrehen + weiter } SelectAll; RotatePoint(0,0, -w -u -60) END; { Alle anschreiben } { FOR i:=1 TO 13 DO BEGIN Get2DPt( loci[i] , 1, x, y ); TextOrigin(x,y); CreateText(Concat(i)); END; } { Faltlinie zeichnen } PenFore(0,0,65530); OpenPoly; BeginPoly; FOR i:=2 TO 9 DO BEGIN Get2DPt( loci[i] , 1, x, y ); AddPoint( x, y ); END; FOR i:=1 TO 4 DO BEGIN Get2DPt( loci[9 - 2*i] , 1, x, y ); AddPoint( x, y ); END; EndPoly; { Schneidelinie zeichnen } PenFore(65530, 0, 0); OpenPoly; BeginPoly; Get2DPt( loci[1] , 1, x, y ); AddPoint( x, y ); FOR i:=1 TO 4 DO BEGIN Get2DPt( loci[i*2] , 1, x, y ); AddPoint( x, y ); END; schnitt[6] := 9; schnitt[7] := 13; schnitt[8] := 7; schnitt[9] := 12; schnitt[10] := 5; schnitt[11] := 11; schnitt[12] := 3; schnitt[13 ] := 10; schnitt[14] := 1; FOR i:=6 to 14 DO BEGIN Get2DPt( loci[ schnitt[i] ] , 1, x, y ); AddPoint( x, y ); END; EndPoly; END; Run(lampe);