// POV-Ray 3.8 // author: Ingo // date: 2020-07-01 // kind of domino like. Square with cutouts, 16 shapes. // Placed with random choise of shape but within rule set: // - left side of shape is same as right side of left neighbour. // - bottom side is same as top side of neighbour below. // - if the last piece is within the range of possible pieces, // increase its chance (in a naive way) #version 3.8; #include "arrays.inc" #global_settings{assumed_gamma 1.0} #default {finish{ambient 0.1 diffuse 0.9}} #declare Stream = seed(7654); #declare Piece0 = box{<-0.45,-0.45,0>,<0.45,0.45,0.2> pigment{rgb 1}}; #declare Piece1 = difference{object{Piece0} cylinder{< 0.0, 0.5,-1.0>,< 0.0, 0.5, 1.0>, 0.25}}; #declare Piece2 = difference{object{Piece1} cylinder{< 0.0,-0.5,-1.0>,< 0.0,-0.5, 1.0>, 0.25}}; #declare Piece22 = difference{object{Piece1} cylinder{< 0.5, 0.0,-1.0>,< 0.5, 0.0, 1.0>, 0.25}}; #declare Piece3 = difference{object{Piece2} cylinder{< 0.5, 0.0,-1.0>,< 0.5, 0.0, 1.0>, 0.25}}; #declare Piece4 = difference{object{Piece3} cylinder{<-0.5, 0.0,-1.0>,<-0.5, 0.0, 1.0>, 0.25}}; #declare Piece = array[16]{ object{Piece0}, object{Piece1}, object{Piece1 rotate<0, 0, -90>}, object{Piece1 rotate<0, 0,-180>}, object{Piece1 rotate<0, 0,-270>}, object{Piece2}, object{Piece2 rotate<0, 0, 90>}, object{Piece22}, object{Piece22 rotate<0, 0, -90>}, object{Piece22 rotate<0, 0,-180>}, object{Piece22 rotate<0, 0,-270>}, object{Piece3}, object{Piece3 rotate<0, 0, -90>}, object{Piece3 rotate<0, 0,-180>}, object{Piece3 rotate<0, 0,-270>}, object{Piece4} } #macro Intersection(Arr1, Arr2) #local Inter = array; #local InterIndex = 0; #for(I,0,dimension_size(Arr1,1)-1) #for(J,0,dimension_size(Arr2,1)-1) #if (Arr1[I] = Arr2[J]) #local Inter[InterIndex] = Arr1[I]; #local InterIndex = InterIndex + 1; #break #end #end #end Inter #end #macro InArray(Arr, In) #local Ind = -1; #for (I, 0, dimension_size(Arr,1)-1) #declare Val = Arr[I]; #if(Val = In) #local Ind = I; #end #end Ind #end #macro RandInt (Min, Max, Stream) int((rand(Stream) * (Max - Min) + Min) + 0.5) //round to nearest int #end #macro DebugArr(arr) #for(I,0,dimension_size(arr,1)-1) #debug concat(str(arr[I],0,0)," ") #end #debug "\n" #end #local LastPiece = array[17]{ array[16]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}, //0 array[8]{1,2,3,4,6,8,9,12}, //1 array[8]{1,2,3,4,6,8,9,12}, //2 array[8]{5,7,10,11,13,14,15,16}, //3 array[8]{1,2,3,4,6,8,9,12}, //4 array[8]{1,2,3,4,6,8,9,12}, //5 array[8]{1,2,3,4,6,8,9,12}, //6 array[8]{5,7,10,11,13,14,15,16}, //7 array[8]{5,7,10,11,13,14,15,16}, //8 array[8]{5,7,10,11,13,14,15,16}, //9 array[8]{1,2,3,4,6,8,9,12}, //10 array[8]{1,2,3,4,6,8,9,12}, //11 array[8]{5,7,10,11,13,14,15,16}, //12 array[8]{5,7,10,11,13,14,15,16}, //13 array[8]{1,2,3,4,6,8,9,12}, //14 array[8]{5,7,10,11,13,14,15,16}, //15 array[8]{5,7,10,11,13,14,15,16}, //16 }; #local LastRowPiece = array[17]{ array[16]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}, //0 array[8]{1,2,3,5,7,8,11,15} //1 array[8]{4,6,9,10,12,13,14,16} //2 array[8]{1,2,3,5,7,8,11,15} //3 array[8]{1,2,3,5,7,8,11,15} //4 array[8]{1,2,3,5,7,8,11,15} //5 array[8]{4,6,9,10,12,13,14,16} //6 array[8]{1,2,3,5,7,8,11,15} //7 array[8]{4,6,9,10,12,13,14,16} //8 array[8]{1,2,3,5,7,8,11,15} //9 array[8]{1,2,3,5,7,8,11,15} //10 array[8]{4,6,9,10,12,13,14,16} //11 array[8]{4,6,9,10,12,13,14,16} //12 array[8]{1,2,3,5,7,8,11,15} //13 array[8]{4,6,9,10,12,13,14,16} //14 array[8]{4,6,9,10,12,13,14,16} //15 array[8]{4,6,9,10,12,13,14,16} //16 }; #declare nRows = 50; #declare nColumns = 50; #declare Field = array[nRows * nColumns]; #declare FieldIndex = 0; #for(Y, 0, nColumns-1) #for(X, 0, nRows-1) //#debug concat("FieldIndex : ", str(FieldIndex,0,0),"\n") #if(FieldIndex = 0) #declare Selector = RandInt(0, 15,Stream); //#debug concat("Selector : ", str(Selector,0,0),"\n") #else #declare LastPieceIndex = Field[FieldIndex - 1]; //#debug concat("LastPieceIndex : ", str(LastPieceIndex,0,0),"\n") #declare LastRowPieceIndex = FieldIndex - nColumns; #if (LastRowPieceIndex < 0) #declare LastRowPieceIndex = 0; #else #declare LastRowPieceIndex = Field[LastRowPieceIndex]; #end //#debug concat("LastRowPieceIndex : ", str(LastRowPieceIndex,0,0),"\n") //DebugArr( LastPiece[LastPieceIndex]) //DebugArr( LastRowPiece[LastRowPieceIndex]) #declare Possible = Intersection(LastPiece[LastPieceIndex], LastRowPiece[LastRowPieceIndex]); //DebugArr(Possible) #declare LastIn = InArray(Possible, LastPieceIndex); //#debug concat("LastIn : ", str(LastIn,0,0),"\n") #declare LastRowIn = InArray(Possible, LastRowPieceIndex); //#debug concat("LastRowIn : ", str(LastRowIn,0,0),"\n\n") #if(LastIn>0) //Naive way to change the chance for last pice reoccurring #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastIn]; #end #if(LastRowIn>0) #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #declare Possible[dimension_size(Possible,1)] = Possible[LastRowIn]; #end //DebugArr(Possible) #declare Selector = Possible[RandInt(0,dimension_size(Possible,1)-1, Stream)]; //#debug concat("Selector : ", str(Selector,0,0),"\n\n") #end #declare Field[FieldIndex] = Selector; #declare FieldIndex = FieldIndex + 1; object{Piece[Selector-1] translate} #end #end /* #declare I = 0; #for(Y,0,3) #for(X,0,3) object{Piece[I] translate } #declare I = I+1; #end #end */ camera{ orthographic angle 30 location<(nRows/2)-0.5,(nColumns/2)-0.5,-100> look_at<(nRows/2)-0.5,(nColumns/2)-0.5,0> } light_source{ <0,0,-1000>, rgb 1 }