{************************************************************************************

   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 fr ( phi = phi -360 ) wiederholt
 ## bis die geg. L„nge unterschritten wird
 ## Ergebnisdatei : spirale.dat
}

define a_spirale
parameter d    { ##  gegebener Durchmesser ## }
parameter l    { ##  gwnschte L„nge       ## }
parameter s    { ##  Durchmesser Rohr ## }
parameter phi1 { ##  Anzahl Drehungen ## }
parameter phi2 { ##  Anzahl Drehungen ## }

open_outfile 1 del_old ((GETENV'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 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





{
 ## 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 fr ( 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 { ##  Anzahl Drehungen  ## }
parameter rmax { ##  Anzahl Drehungen  ## }


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 ((GETENV'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