Raedschelder
Nichtperiodische Parkettierung
Spektrum 2/2013, Christoph Pöppe 
================================
ScriptBegin
var Grafik = "Script Turtle"

var farbmode=3        // Farbwahl 
var cBack="darkgray"; // "black"

var a=6;           // Radius  
var b=0.7;         // 0< Kerbe <1 
var d=1.05;         // >1 Zwischenraum 
var x=-50; y=250;  // Anfangspunkt
var w=15;          // Drehwinkel
var anz=50;        // Anzahl der Steine 
var farbmode=3     // Farbwahl 


function getFarben()
{ var s="";
  switch(farbmode)
  { case 0:   
      t.setRndRGB("blue","red");
      for(i=1; i<7; i++)  s=s.concat(t.rndRGB2()+",");
      break;

    case 1:   
      t.setRndRGB("#cad148","#ffd148");
      t.setRndHeller(80,80);
      for(i=1; i<7; i++)  s=s.concat(t.rndRGB2()+",");
      break;

    case 2:
      s="#ad4419,#c2e277,#ff6f44,#ffd148,#8ca031,#7fc9ff";
      break;

    default:
      s="#7268ff,#946bff,#fc16ff,#ff7d9e,#ea00cb,#b88dff";
      break;
  }
  t.msg(s);
  return s
}


function init()
{ t.setBrush(cBack);
  t.setPage(-58,105,4,8);
  t.setAntiAliasing();  
}

// --------------------------------------------------------
function draw()
{ t.drawKoordSystem();
  //t.drawRaster();
  t.clrMsg(); t.clrDraw("0");
 
  defBasisStein();
  defSteine(getFarben());
  drawSteine();
  drawMuster();
}


function drawMuster()
{ var s=startSpalte("1", anz); //t.msg(s);
  var max=s.length;

  t.setNoStyle(); t.turnTo(w); t.goTo(x,y);
  var i=1;
  while (i<=max)
  { drawSpalte(s);
    s=nextSpalte(s, 5);  //t.msg(s,"red")
    t.goTo(x,y); t.shift("vektor2",i); 
    if (s.length<0) exit;
    i++;
  }
}


function drawSpalte(s)
{ 
  for(i=0; i<s.length; i++) 
  { t.draw("Stein"+s.charAt(i)); t.shift("vektor1");}
}

function defPoly()
{ t.beginPolygon();
 t.moveTo(-3,-5.19615);
 t.moveTo(0.23756,-3.04173);
 t.moveTo(-2.07865,-10.4655);
 t.moveTo(1.54414,-3.74318);
 t.moveTo(3,-5.19615);
 t.endPolygon(3);
} // Add=false


function defBasisStein()
{ // Basisstein definieren
  t.goTo(0,0); t.defPoint("M");

   t.isoPolygon(d*a,6,3); t.drawPolygon();
//  t.defPoint("A",-2);
  t.defPoint("B",-1); 
  t.defPoint("C",0);   t.defPoint("D",1);
  t.defPoint("E",2);
  
  t.defVector("vektor1","D","B");
  t.defVector("vektor2","E","C");


  t.isoPolygon(a,6,3); t.drawPolygon();
  t.defPoint("A",-2); 
/* 
  t.defPoint("B",-1); 
  t.defPoint("C",0);   t.defPoint("D",1);
  t.defPoint("E",2);
 
  t.goTo(0,0); 
  t.draw("A"); t.draw("B"); t.draw("C");
  t.draw("D"); t.draw("E");

//  t.defPoint("vektor1","D","B");
//  t.defPoint("vektor2","E","C");
*/
  if (!t.exists("line0"))
  { defPoly(); t.defDraw("line0");
  }

  

  t.beginPolygon();
  t.setPolygon("line0",4);
  t.endPolygon(3);  


  t.defDraw("line");

  t.setRotate(-120); t.addPolygon("line",-1);
  t.setRotate(-60);  t.addPolygon("line",-1);
  t.setRotate(180);  t.addPolygon("line");
  t.setRotate(60);   t.addPolygon("line",-1);
  t.setRotate(-60);  t.addPolygon("line");
 
  t.endPolygon(3);
  t.setPen("red",0); t.defDraw("Stein"); 

  t.setIdentity();
  t.goTo(0,-50);  t.draw("Stein"); t.draw("M"),
  t.msgDraw();
}


function defStein(n,w,farbe)
{ // Stein-n mit Drehwinkel w aus Stein ableiten

  t.goTo(0,0); t.beginPolygon();
  t.setRotate(w); 
  t.setPolygon("Stein");
  t.endPolygon();
  t.setBrush( farbe );t.setPen("black",0);  
  t.defDraw("Stein"+n);

  // Verziehrungen
  t.goTo(0,0); t.isoPolygon(0.5,-1);
  t.setPen("black",0); t.setBrush( "white",0 ) 
//t.defDraw("Stein"+n,1); 

  t.setIdentity();   
}



function defSteine(s)
{
  var a; a=s.split(",");
  defStein(1,-120,a[0]);
  defStein(2,-60 ,a[1]);
  defStein(3,0   ,a[2]);
  defStein(4,60  ,a[3]);
  defStein(5,120 ,a[4]);
  defStein(6,180 ,a[5]);
}


function drawSteine()
{
  t.setNoStyle(); t.turnTo(0); 
  t.goTo(-30, 6.4*a); 
  for(n=1; n<7; n++)
   { t.turnTo(0); t.draw("Stein"+n); 
     t.turnTo(-90); t.move(3.2*a);
   }
}

// Mögliche Anschschlussteine zum Stein n

function down(n)
{ // Anschlussteile nach unten
  switch(parseInt(n))
  { case 1: case 2: case 5: return "136";
    case 3: case 4: case 6: return "245";
    default: return "?"}  
}

function rightUp(n)
{ // Anschlussteile nach rechts oben
  switch(parseInt(n))
  { case 2: case 5: case 6: return "146";
    case 1: case 3: case 4: return "235";
    default: return "?" }
}

function rightDown(n)
{ // Anschlussteile nach rechts unten
  switch(parseInt(n))
  { case 2: case 3: case 6: return "124";
    case 1: case 4: case 5: return "356";
    default: return "?" } 
}


function durchschnitt(a,b)
{ var s=""; 
  for(i=0; i<a.length; i++)
  { c=a.charAt(i)
    if (b.indexOf(c)>-1) 
     { if (s.indexOf(c)<0) s=s.concat(c); }
  }
  return s;
}


function nextN(NleftUp, NleftDown, NUp)
{ // Die nächste Steinnummer N aus den umliegenden Steinen
  // berechnen. Input: links oben, links unten, oben

  s=durchschnitt( rightDown(NleftUp), rightUp(NleftDown));
  return durchschnitt( down(NUp), s);
}


function nextSpalte(Spalte, nr)
{ // Steinnummern der nächsten Spalte berechnen
  // Input: letzte Spalte, Start nr der nächsten Spalte

  var s=""; s=s.concat(nr);
  var imax=Spalte.length;  var i=1; var i1=2;
  while(i1<imax)
  { nr=nextN(Spalte.charAt(i),Spalte.charAt(i1), nr)
    s=s.concat(nr);
    i++; i1++;
  }
  return s;
}

function startSpalte(nr, n)
{ // Steinnummern der Startspalte
  s="";
  for(i=0; i<n; i++) { s=s.concat(nr);}
  return s;
}

ScriptEnd
----------------------------------------------
