(*  DBD02 - Golden Cut Ratio, Juni 2008
  Tesselation assignment
  Wouter Kersteman, s021467
*)

(*Rotatie Matrix van 60 graden*)

rot60[xy_]:=(({{Cos[(π/3)], -Sin[(π/3)]}, {Sin[(π/3)], Cos[(π/3)]}})).xy;

Rot60[xylist_]:=rot60 /@xylist; (*Rotatie van 60 graden van een lijn*)
Rot120[xylist_]:=Rot60[Rot60[xylist]]; (*Rotatie van 120 graden van een lijn*)
Rot180[xylist_]:=Rot60[Rot60[Rot60[xylist]]]; (*Rotatie van 180 graden van een lijn*)

ROT60[xylistlist_]:= Rot60 /@xylistlist; (*Rotatie van 60 graden van een figuur*)
ROT120[xylistlist_]:= Rot120 /@xylistlist;  (*Rotatie van 120 graden van een figuur*)
ROT180[xylistlist_]:=Rot180 /@xylistlist;  (*Rotatie van 180 graden van een figuur*)
ROT240[xylistlist_]:=ROT120[ROT120[xylistlist]];  (*Rotatie van 250 graden van een figuur*)

(*Heesch type CC3C3C6C6*)
ptA={0,0}; 
ptB={5,0};
ptC={-2.5,4.330};     (*-Sin[(1/3)π]×5*)
ptD={5.776,2.898};   (*5+Cos[(5/12)π]×3  AND  Sin[(5/12)π]×3*)
ptE={2.879,2.121};   (*5+(Cos[(5/12)π]×3)-(Cos[(1/12)π]×3)  AND  (Sin[(5/12)π]×3)-(Sin[(1/12)π]×3) *)
ptM={0.189,3.226};

(*Translatie van punt M naar punt D*)
transDM[xy_]:=xy+(ptM-ptD);
TransDM[xylist_]:=transDM /@ xylist;
TRANSDM[xylistlist_]:=TransDM /@ xylistlist;

(*Translatie van punt D naar punt M*)
transMD[xy_]:=xy+(ptD-ptM);
TransMD[xylist_]:=transMD /@ xylist;
TRANSMD[xylistlist_]:=TransMD /@ xylistlist;

(*Translatie van punt A naar punt M*)
transAM[xy_]:=xy+(ptM-ptA);
TransAM[xylist_]:=transAM /@ xylist;
TRANSAM[xylistlist_]:=TransAM /@ xylistlist;

(*Rotatie om punt A dmv translaties naar en van de oorsprong*)
transOA[xy_]:=xy+ptA;
TransOA[xylist_]:=transOA /@ xylist;
TRANSOA[xylistlist_]:=TransOA /@ xylistlist;
transAO[xy_]:=xy-ptA;
TransAO[xylist_]:=transAO /@ xylist;
TRANSAO[xylistlist_]:=TransAO /@ xylistlist;

(*Rotatie om punt M dmv translaties naar en van de oorsprong*)
transOM[xy_]:=xy+ptM;
TransOM[xylist_]:=transOM /@ xylist;
TRANSOM[xylistlist_]:=TransOM /@ xylistlist;
transMO[xy_]:=xy-ptM;
TransMO[xylist_]:=transMO /@ xylist;
TRANSMO[xylistlist_]:=TransMO /@ xylistlist;

(* Vrije Lijnen Stinkdier *)
skunk1={ptA,{0.614,-0.234},{0.906,0},{1.211,-0.190},{2.308,0.249},{3.678,0.122},{4.005,0.305},{4.274,0.0671},ptB};   (*C3*)
skunk2={ptE,{3.774,2.549},{3.852,2.937},{4.274,3},{4.463,2.655},{5.295,2.526},ptD};                                                                                 (*C6*)
skunk3={ptC,{0.036,3.705},ptM};                                                                                                                                                                                                                     (*C*)

(*Graveer Lijnen*)
(*Oog*)
eye = Table[{4.3+(1/5)Cos[i(π/10)],2.2+(1/5)Sin[i(π/10)]},{i,1,21}];  (* Teken het oog *)
eye2 = Table[{4.35+(1/10)Cos[i(π/10)],2.15+(1/10)Sin[i(π/10)]},{i,1,21}];  (* Teken het oog *)
(*Voetjes*)
vt1 = {{0.958,0},{1.123,0.732}};
vt2={{4.005,0.305},{3.889,0.920}};
(*Staartstrepen*)
tail1 = {ptC,{-0.388,3.544},{0.084,2.484},ptE};
tail2= {{-2.352,4.001},{-0.787,3.356},{-0.042,2.107},ptE};
tail3={{-2.195,3.668},{-1.207,3.177},{-0.199,1.708},ptE};

(* Gedraaide Lijnen Stinkdier - weglaten om dubbele lijnen te voorkomen *)
skunk1A=(#+ptA)& /@ Rot120[(#-ptA)& /@skunk1];
skunk2D=(#+ptD)& /@ Rot60[(#-ptD)& /@skunk2];
skunk3M=(#+ptM)& /@ Rot180[(#-ptM)& /@skunk3];

(*Groeperen van snijelementen en graveerelementen*)
cutting={skunk1,skunk2,skunk3};
gravure={eye, eye2,vt1,vt2,tail1,tail2,tail3};

(*Translaties*)
T1[xylistlist_]:=TRANSDM[TRANSDM[xylistlist]];                                           (*Translatie over in de X-richting*)
T2[xylistlist_]:=TRANSDM[TRANSAM[TRANSAM[TRANSAM[xylistlist]]]]; (*Translatie over in de Y-richting*)

(*Rotatie van 120 graden om punt A om de rozetten van 3 beestjes te krijgen*)
ROT120A[xylistlist_]:=TRANSOA[ROT120[TRANSAO[xylistlist]]]; (*driehoekje maken*)
(*Rotatie van 120 graden om punt A om ruitjes te krijgen*)
ROT180M[xylistlist_]:=TRANSOM[ROT180[TRANSMO[xylistlist]]]; (*ruit maken*)

(*Toepassen van alle translaties en samenvoegen in tabel*)
W3:=Table[Line[Nest[T2,Nest[T1,Nest[ROT180M,Nest[ROT120A,cutting,i],j],k],l]],{i,0,2},{j,0,1},{k,0,3},{l,0,3}];
W3D:=Table[Line[Nest[T2,Nest[T1,Nest[ROT180M,Nest[ROT120A,gravure,i],j],k],l]],{i,0,2},{j,0,1},{k,0,3},{l,0,3}];

(*Laat het resultaat zien*)
Show[Graphics[{Black,W3,Red,W3D}]]

(*Exporteer resultaat als PDF*)
Export["skunk.pdf",Show[Graphics[{Red,W3,Black,W3D}]]];