{************************************************************************************ a_spirale Berechnung und Optimierung für archimedische Spirale Geg : Gesamtdurchmesser Gesamtlänge Rohrdurchmesser Anfangwinkel Endwinkel Ges : Abstand zwischen Rohrwindungen Berechnungsbeispiel : a_spirale 70 800 2.13 360 ( 3600 - 15 ) Zeichnen der Geometrie für letzte Lösung die in der Datei 'spirale.dat' abgelegt werden a_zeichne 15 p Ralf Scheffer *************************************************************************************} { ## Spiralenl„nge bestimmen } define a_spirale_l parameter phi parameter a let phi ( phi * pi / 180 ) let sbog ( a / 2 * ( phi * sqrt ( 1+ phi*phi ) + ln ( phi + sqrt ( 1+ phi * phi ) ) ) ) end_define { ## Spirale rechnen } define a_rechne parameter a { ## Abstand ## } parameter phi1 { ## Anzahl Drehungen ## } parameter phi2 { ## Anzahl Drehungen ## } let sp_a ( a ) let sp_phi1 ( phi1 ) let sp_phi2 ( phi2 ) let sp_ab ( a * 2 * pi ) let sp_wi ( int ( (phi2 - phi1) / 360 ) + int (phi1/360) + 1.75 ) let sp_d ( sp_ab * sp_wi * 2 ) { display (' Abstand = ' + str sp_ab + ' Anzahl der Windungen = ' + str sp_wi + 'Durchmesser = '+ str sp_d ) } end_define { ## Spiralen zeichnen ( SPLINE ) } define a_spline parameter dphi parameter s let a sp_a let phi1 sp_phi1 let phi2 sp_phi2 let phi2 sp_phi2 let phi phi1 let r ( a * phi * pi/180 ) let er ( pnt_xy ( cos phi ) ( sin phi ) ) let p2 ( sp_p + ( r + s ) * er ) let sp_firstp p2 spline p2 loop let phi ( phi + dphi ) let r ( a * phi * pi/180 ) let er ( pnt_xy ( cos phi ) ( sin phi ) ) let p2 ( sp_p + ( r + s ) * er ) p2 exit_if ( phi > phi2 ) end_loop end end let sp_lastp p2 end_define { ## Spiralrohr zeichnen und zu B”gen konvertieren } define a_zeichne parameter dphi parameter p parameter faktor parameter auftrennen get_massstab c_line horizontal p end c_line vertical p end init_part 'SPIRALE' let sp_p p mittel a_spline dphi 0 a_spirale_konvert auftrennen faktor init_subpart 'Spiralenwand' sichtbar a_spline dphi (sp_s) a_spirale_konvert auftrennen faktor end_part init_subpart 'Spiralenwand' sichtbar a_spline dphi (-sp_s) a_spirale_konvert auftrennen faktor end_part end_part end_define { ## Spline Konvertieren } define a_spirale_konvert parameter auftrennen parameter faktor if ( auftrennen ) convert_spline faktor sp_lastp end_if end_define define a_spirale_len local sb a_spirale_l sp_phi1 sp_a let sb sbog a_spirale_l sp_phi2 sp_a let sp_len ( sbog - sb ) end_define { ## Berechnung Spirale mit Optimierung ## Es wird zuerst mit a = 1 gerechnet ## Die daraus resultierende Durchmesser mit dem geg. D verrechnet ## Es wird solange dieser Vorgang fr ( phi = phi -360 ) wiederholt ## bis die geg. L„nge unterschritten wird ## Ergebnisdatei : spirale.dat } define a_spirale parameter d { ## gegebener Durchmesser ## } parameter l { ## gwnschte L„nge ## } parameter s { ## Durchmesser Rohr ## } parameter phi1 { ## Anzahl Drehungen ## } parameter phi2 { ## Anzahl Drehungen ## } open_outfile 1 del_old '/cocreate/temp/spirale.out' write_file 1 '--------------------------------------------' write_file 1 'Berechnung archimedische Spirale mit ME10 ' write_file 1 '--------------------------------------------' write_file 1 ('Geg: Durchmesser d : ' + str d ) write_file 1 (' L„nge l : ' + str l ) write_file 1 (' Rohrdurchmesser s : ' + str s ) write_file 1 (' Anfangswinkel phi1: ' + str phi1 ) write_file 1 (' Endwinkel phi2: ' + str phi2 ) write_file 1 '----------+----------+----------+----------+' write_file 1 'Abstand Windungen Durchmesser L„nge ' write_file 1 '----------+----------+----------+----------+' loop a_rechne 1 phi1 phi2 a_rechne (d/sp_d) phi1 phi2 a_spirale_len myformat sp_ab 10 0 let w1 swert myformat sp_wi 10 2 let w2 swert myformat sp_d 10 2 let w3 swert myformat sp_len 10 0 let w4 swert write_file 1 (w1 + '|' + w2 + '|' + w3 + '|' + w4 +'|' ) exit_if ( sp_len <= l ) let phi2 ( phi2 - 360 ) exit_if ( phi2 < 0 ) end_loop write_file 1 '----------+----------+----------+----------+' write_file 1 (' Endwinkel phi2: ' + str phi2 ) write_file 1 '--------------------------------------------' write_file 1 '' write_file 1 'Variation des Abstandes ' write_file 1 '--------------------------------------------' a_rechne1 phi1 phi2 l write_file 1 '--------------------------------------------' close_file 1 let sp_s ( s/2 ) end_define { Runden einer Zahl x auf n-Stellen } define myround parameter x parameter n (int((x*10**n)+0.5)/(10**n)) end_define { Formatieren einer Zahl xauf m-Stellen und n Nachkommastellen Rueckgabemakro : swert } define myformat parameter x parameter m parameter n local sl local pp local an local vn let wert (myround x n) let swert (str wert) let sl (len swert) let pp (pos swert '.' ) let an '' if (pp=0) if (n>0) let an ('.'+(rpt '0' n)) end_if else_if (sl-pp<=n) let an (rpt '0' (abs(sl-pp-n))) end_if let swert (swert+an) let sl (len swert) let vn '' if (m-sl>0) let vn ( rpt ' ' (m-sl) ) end_if let swert (vn+swert) end_define define a_rechne1 parameter phi1 parameter phi2 parameter l display (' Gerechnete Abstand war '+ str sp_ab ) loop read number 'Geben sie gewnschten Abstand ein Ende <0>' d_abstand exit_if ( d_abstand = 0 ) let d_abstand ( d_abstand / pi / 2 ) a_rechne 1 phi1 phi2 a_rechne (d_abstand ) phi1 phi2 a_spirale_len if ( sp_len < l ) a_rechne_loop1 phi1 phi2 l d_abstand else a_rechne_loop2 phi1 phi2 l d_abstand end_if end_loop end_define define a_rechne_loop1 parameter phi1 parameter phi2 parameter l parameter d_abstand loop a_rechne 1 phi1 phi2 a_rechne (d_abstand ) phi1 phi2 a_spirale_len myformat sp_ab 10 0 let w1 swert myformat sp_wi 10 2 let w2 swert myformat sp_d 10 2 let w3 swert myformat sp_len 10 0 let w4 swert write_file 1 (w1 + '|' + w2 + '|' + w3 + '|' + w4 +'|' ) exit_if ( sp_len > l ) let phi2 ( phi2 + 360 ) end_loop end_define define a_rechne_loop2 parameter phi1 parameter phi2 parameter l parameter d_abstand loop a_rechne 1 phi1 phi2 a_rechne (d_abstand ) phi1 phi2 a_spirale_len myformat sp_ab 10 0 let w1 swert myformat sp_wi 10 2 let w2 swert myformat sp_d 10 2 let w3 swert myformat sp_len 10 0 let w4 swert write_file 1 (w1 + '|' + w2 + '|' + w3 + '|' + w4 +'|' ) exit_if ( sp_len < l ) let phi2 ( phi2 - 360 ) end_loop end_define { ## Berechnung Spirale mit Optimierung ## Es wird zuerst mit a = 1 gerechnet ## Die daraus resultierende Durchmesser mit dem geg. D verrechnet ## Es wird solange dieser Vorgang fr ( phi = phi -360 ) wiederholt ## bis die geg. L„nge unterschritten wird ## Ergebnisdatei : spirale.dat } define a_spirale1 parameter a { ## gegebener Abstand ## } parameter l { ## gwünschte Länge ## } parameter s { ## Durchmesser Rohr ## } parameter rmin { ## min. Radius (innen Durchmesserr ## } parameter rmax { ## max. Radius (außen Durchmesser ## } let d ( rmax * 2 ) let phi1 0 loop let r ( a / 2 / pi * phi1 * pi/180 ) exit_if ( r > rmin ) let phi1 ( phi1 + 10 ) end_loop let phi2 0 loop let r ( a / 2 / pi * phi2 * pi/180 ) let phi2 ( phi2 + 10 ) exit_if ( r > rmax ) end_loop let phi2 ( 360 * int ( phi2 / 360 + 2.5 ) - 15 ) let phi1 ( 360 * int ( phi1 / 360 + 0.5 )) display ('d <'+str d+'> phi1 <'+str phi1+'> phi2 <'+str phi2+'>') open_outfile 1 del_old '/cocreate/temp/spirale.out' write_file 1 '--------------------------------------------' write_file 1 'Berechnung archimedische Spirale mit ME10 ' write_file 1 '--------------------------------------------' write_file 1 ('Geg: Durchmesser d : ' + str d ) write_file 1 (' L„nge l : ' + str l ) write_file 1 (' Rohrdurchmesser s : ' + str s ) write_file 1 (' Anfangswinkel phi1: ' + str phi1 ) write_file 1 (' Endwinkel phi2: ' + str phi2 ) write_file 1 '----------+----------+----------+----------+' write_file 1 'Abstand Windungen Durchmesser L„nge ' write_file 1 '----------+----------+----------+----------+' loop a_rechne 1 phi1 phi2 a_rechne (a/2/pi) phi1 phi2 a_spirale_len myformat sp_ab 10 0 let w1 swert myformat sp_wi 10 2 let w2 swert myformat sp_d 10 2 let w3 swert myformat sp_len 10 0 let w4 swert write_file 1 (w1 + '|' + w2 + '|' + w3 + '|' + w4 +'|' ) exit_if ( sp_len <= l ) let phi2 ( phi2 - 360 ) exit_if ( phi2 < 0 ) end_loop write_file 1 '----------+----------+----------+----------+' write_file 1 (' Endwinkel phi2: ' + str phi2 ) write_file 1 '--------------------------------------------' write_file 1 '' write_file 1 'Variation des Abstandes ' write_file 1 '--------------------------------------------' a_rechne1 phi1 phi2 l write_file 1 '--------------------------------------------' close_file 1 let sp_s ( s/2 ) end_define { Runden einer Zahl x auf n-Stellen } define myround parameter x parameter n (int((x*10**n)+0.5)/(10**n)) end_define { Formatieren einer Zahl xauf m-Stellen und n Nachkommastellen Rueckgabemakro : swert } define myformat parameter x parameter m parameter n local sl local pp local an local vn let wert (myround x n) let swert (str wert) let sl (len swert) let pp (pos swert '.' ) let an '' if (pp=0) if (n>0) let an ('.'+(rpt '0' n)) end_if else_if (sl-pp<=n) let an (rpt '0' (abs(sl-pp-n))) end_if let swert (swert+an) let sl (len swert) let vn '' if (m-sl>0) let vn ( rpt ' ' (m-sl) ) end_if let swert (vn+swert) end_define define a_rechne1 parameter phi1 parameter phi2 parameter l display (' Gerechnete Abstand war '+ str sp_ab ) loop read number 'Geben sie gewünschten Abstand ein Ende <0>' d_abstand exit_if ( d_abstand = 0 ) let d_abstand ( d_abstand / pi / 2 ) a_rechne 1 phi1 phi2 a_rechne (d_abstand ) phi1 phi2 a_spirale_len if ( sp_len < l ) a_rechne_loop1 phi1 phi2 l d_abstand else a_rechne_loop2 phi1 phi2 l d_abstand end_if end_loop end_define define a_rechne_loop1 parameter phi1 parameter phi2 parameter l parameter d_abstand loop a_rechne 1 phi1 phi2 a_rechne (d_abstand ) phi1 phi2 a_spirale_len myformat sp_ab 10 0 let w1 swert myformat sp_wi 10 2 let w2 swert myformat sp_d 10 2 let w3 swert myformat sp_len 10 0 let w4 swert write_file 1 (w1 + '|' + w2 + '|' + w3 + '|' + w4 +'|' ) exit_if ( sp_len > l ) let phi2 ( phi2 + 360 ) end_loop end_define define a_rechne_loop2 parameter phi1 parameter phi2 parameter l parameter d_abstand loop a_rechne 1 phi1 phi2 a_rechne (d_abstand ) phi1 phi2 a_spirale_len myformat sp_ab 10 0 let w1 swert myformat sp_wi 10 2 let w2 swert myformat sp_d 10 2 let w3 swert myformat sp_len 10 0 let w4 swert write_file 1 (w1 + '|' + w2 + '|' + w3 + '|' + w4 +'|' ) exit_if ( sp_len < l ) let phi2 ( phi2 - 360 ) end_loop end_define  define sichtbar color red linetype solid end_define define mittel color white linetype dot_center end_define