local MARGEN = 10 local AMPLITUD , WAVE_WIDTH = 30 , 600 local GAP_BETWEEN_WAVES = 25 local NUM_WAVES = 7 local FONT_SIZE , FONT_FUDGE = 20 , 5 WAVE_STYLE local = 'stroke = "# 000" stroke-width = "1.5" fill = "none"'locales img_wd = 2 * MARGIN + WAVE_WIDTH local de img_ht = 2 * MARGEN + NUM_WAVES * AMPLITUD * 2 + ( NUM_WAVES - 1 ) * GAP_BETWEEN_WAVESlocal de PI = Math.asin ( 1 ) * 2 locales XD = PI / 12 local de SQRT2 = math.sqrt ( 2 ) local de Y1 = ( 2 * SQRT2 ) / 7 - 1 / 7 locales Y2 = ( 4 * SQRT2 ) / 7 - 2 / 7 locales Y3 = SQRT2 / 2locales Y4 = ( 3 * SQRT2 ) / 7 + 2 / 7función sine_wave_path ( x , y , width , amp , num_half_waves ) local xmul = width / ( num_half_waves * PI ) local xd = XD * xmul local path = 'M' .. coords ( x , y ) for _ = 1 , num_half_waves do ruta = ruta .. 'C' .. coords ( x + xd , y + amp * Y1 ) .. '' .. coords ( x + 2 * xd , y + amp * Y2 ) .. '' .. coords ( x + 3 * xd , y + amp * Y3 ) .. 'C' .. coords ( x + 4 * xd , y + amp * Y4 ) .. '' .. coords ( x + 5 * xd , y + amp ) .. '' .. coords ( x + 6 * xd , y + amp ) .. 'C' .. coords ( x + 7 * xd , y + amp ) .. '' .. coords ( x + 8 * xd , y + amp * Y4 ) .. '' .. coords ( x + 9 * xd , y + amp * Y3 ) .. 'C' .. coords ( x + 10 * xd , y + amp * Y2 ) .. '' .. coords ( x + 11 * xd , y + amp * Y1 ) .. '' .. coords ( x + 12 * xd , y ) x = x + anchura / num_half_waves amp = amp * - 1 - flip sobre verticalmente cada media onda final retorno trayectoria finalfunción coords ( x , y ) return string.format ( '% g,% g' , x , y ) endlocal fh = assert ( io.open ( "Harmonic_partials_on_strings.svg" , "wb" )) fh : write ( '<? xml version = "1.0" encoding = "UTF-8"?> \ n ' .. '<svg versión = "1.0" ancho = "' , img_wd , '" altura = "' , img_ht , '" xmlns = "http://www.w3.org/2000/svg"> \ n ' )locales y_origin = MARGIN + AMPLITUD locales wave_labels , pick_circles = '' , '' para n = 1 , NUM_WAVES hacen locales amp = AMPLITUD - ( n - 1 ) * AMPLITUD * 0,1 fh : escritura ( '<ruta' , WAVE_STYLE , 'd = "' , ruta_de_sine_wave ( MARGEN , y_origin , WAVE_WIDTH , amplificador , n ), '' , sine_wave_path ( MARGEN , y_origin , WAVE_WIDTH , - amplificador , n ), '"/> \ n ' ) si n > 1 entonces locales pick_x = MARGIN + WAVE_WIDTH / n local de pick_r = AMPLITUD * 0.2 pick_circles = pick_circles .. '<círculo cx = "' .. pick_x .. '"cy ="' .. y_origin + pick_r .. '"r ="' .. pick_r .. '"/> \ n ' wave_labels = wave_labels .. '<texto x ="' .. pick_x .. '"y ="' .. y_origin - FONT_SIZE + 2 * FONT_FUDGE .. '"> 1 /' .. n .. '</text> \ n ' end y_origin = y_origin + 2 * AMPLITUDE + GAP_BETWEEN_WAVESfinfh : write ( '<g stroke = "# 000" fill = "# bbb"> \ n ' , pick_circles , '</g> \ n ' , '<g font-family = "Bitstream Vera Sans" tamaño de fuente = " ' FONT_SIZE , 'px "' , 'text-anchor = "medio"> \ n ' , '<texto x ="' , MARGEN + FONT_FUDGE , '" y = "' ,MARGEN + AMPLITUD - FONT_SIZE + 2 * FONT_FUDGE , '"> 0 </text> \ n ' , '<Text x = "' , MARGIN + WAVE_WIDTH - FONT_FUDGE , ' "y ="' , MARGIN + AMPLITUD - FONT_SIZE + 2 * FONT_FUDGE , '"> 1 </ text> \ n ' wave_labels , '</ g> \ n ' , ' </svg> \ n ' )