// these lines alway lead to rounding errors, don't know what to do about it
#declare RA1 = seed(3949);

#declare linewidth = linespace *3 / 110;

#declare xp = 1;
#while (xp <= Width)

#declare amp = ((Width-1)/2 - abs((Width + 1)/2 - xp)) * 0.01 / (Width*4/19);

#declare f1 = rand(RA1)*30 + 2;
#declare f2 = rand(RA1)*30 + 2;
#declare f3 = rand(RA1)*30 + 2;
#declare f4 = rand(RA1)*30 + 2;
#declare f5 = rand(RA1)*30 + 2;
#declare f6 = rand(RA1)*30 + 2;
#declare f7 = rand(RA1)*30 + 2;
#declare f8 = rand(RA1)*30 + 2;

#declare o = 0;
#while (o < 1000)

#declare m = 0.55-linespace/2+xp*linespace + 
  sin(o/1000*f1+f5)*amp +
  sin(o/1000*f2+f6)*amp +
  sin(o/1000*f3+f7)*amp +
  sin(o/1000*f4+f8)*amp;
  
sphere { <m, 0.55+linespace/2+o*(Width-1)*linespace/1000, 0> linewidth texture { pigment { color 0 } } }

#declare o = o + 1;
#end


#declare e1 = rand(RA1)*30 + 2;
#declare e2 = rand(RA1)*30 + 2;
#declare e3 = rand(RA1)*30 + 2;
#declare e4 = rand(RA1)*30 + 2;
#declare e5 = rand(RA1)*30 + 2;
#declare e6 = rand(RA1)*30 + 2;
#declare e7 = rand(RA1)*30 + 2;
#declare e8 = rand(RA1)*30 + 2;

#declare o = 0;
#while (o < 1000)

#declare m = 0.55-linespace/2+xp*linespace + 
  sin(o/1000*e1+e5)*amp +
  sin(o/1000*e2+e6)*amp +
  sin(o/1000*e3+e7)*amp +
  sin(o/1000*e4+e8)*amp;
  
sphere { <0.55+linespace/2+o*(Width-1)*linespace/1000,m, 0> linewidth texture { pigment { color 0 } } }

#declare o = o + 1;
#end

#declare xp = xp + 1;
#end

// and now for the complicates part: the point at the special places for markers
// because of the crooky lines I don't know the position of the intersection of
// the lines so I have to make an iteration


#declare xpoint = 1;
#while (xpoint <= Width)

#declare ypoint = 1;
#while (ypoint <= Width)

#if ((Width = 19) * ((xpoint = 4) + (xpoint = 10) + (xpoint = 16)) *
                    ((ypoint = 4) + (ypoint = 10) + (ypoint = 16)) +
     (Width = 13) * ((xpoint = 4) + (xpoint = 7) + (xpoint = 10)) *
                    ((ypoint = 4) + (ypoint = 7) + (ypoint = 10)) +
     (Width = 9) * (((xpoint = 3) + (xpoint = 7))*
                    ((ypoint = 3) + (ypoint = 7)) +
		    (xpoint = 5) * (ypoint = 5)))

// first find the necessary parameter for the functions
#declare RA1 = seed(3949);

#declare o = 1;
#while (o <= Width)

#if (o = xpoint)
#declare f1 = rand(RA1)*30 + 2;#declare f2 = rand(RA1)*30 + 2;#declare f3 = rand(RA1)*30 + 2;#declare f4 = rand(RA1)*30 + 2;
#declare f5 = rand(RA1)*30 + 2;#declare f6 = rand(RA1)*30 + 2;#declare f7 = rand(RA1)*30 + 2;#declare f8 = rand(RA1)*30 + 2;
#declare ampF = ((Width-1)/2 - abs((Width + 1)/2 - o)) * 0.01 / (Width*4/19);
#else
#declare tmp = rand(RA1);#declare tmp = rand(RA1);#declare tmp = rand(RA1);#declare tmp = rand(RA1);
#declare tmp = rand(RA1);#declare tmp = rand(RA1);#declare tmp = rand(RA1);#declare tmp = rand(RA1);
#end

#if (o = ypoint)
#declare e1 = rand(RA1)*30 + 2;#declare e2 = rand(RA1)*30 + 2;#declare e3 = rand(RA1)*30 + 2;#declare e4 = rand(RA1)*30 + 2;
#declare e5 = rand(RA1)*30 + 2;#declare e6 = rand(RA1)*30 + 2;#declare e7 = rand(RA1)*30 + 2;#declare e8 = rand(RA1)*30 + 2;
#declare ampE = ((Width-1)/2 - abs((Width + 1)/2 - o)) * 0.01 / (Width*4/19);
#else
#declare tmp = rand(RA1);#declare tmp = rand(RA1);#declare tmp = rand(RA1);#declare tmp = rand(RA1);
#declare tmp = rand(RA1);#declare tmp = rand(RA1);#declare tmp = rand(RA1);#declare tmp = rand(RA1);
#end

#declare o = o + 1;
#end

// now iterate over the point 
#declare o = 0;

#declare xpos = xpoint*linespace * 1000 / (19*linespace);

#while(o < 1000)

#declare ypos = (xpoint*linespace + 
  sin(xpos/1000*e1+e5)*ampE +
  sin(xpos/1000*e2+e6)*ampE +
  sin(xpos/1000*e3+e7)*ampE +
  sin(xpos/1000*e4+e8)*ampE) * 1000 / (19*linespace);

#declare xpos = (ypoint*linespace + 
  sin(ypos/1000*f1+f5)*ampF +
  sin(ypos/1000*f2+f6)*ampF +
  sin(ypos/1000*f3+f7)*ampF +
  sin(ypos/1000*f4+f8)*ampF) * 1000 / (19*linespace);

#declare o = o + 1;
#end

#declare xpos = (xpos * 19 * linespace / 1000) + 0.55 - linespace/2;
#declare ypos = (ypos * 19 * linespace / 1000) + 0.55 - linespace/2;

sphere { <xpos, ypos, 0> linewidth*5 texture { pigment { color 0 } } }

#end

#declare ypoint = ypoint + 1;
#end

#declare xpoint = xpoint + 1;
#end