#include "../../header.h" //shifts puzzle piece one to the right void PuzzlePiece::shift(unsigned int moves) { shifts = (shifts+moves)%4; setConnections(((getConnections() >> (moves*2)) | (getConnections() << sizeof(unsigned char)*8 - (moves*2)))); } //creates random centerpiece void PuzzlePiece::randomCenterPiece() { setConnections(0b00000000); if(rand()%2) setConnections(getConnections() | 0b01000000); else setConnections(getConnections() | 0b10000000); if(rand()%2) setConnections(getConnections() | 0b00010000); else setConnections(getConnections() | 0b00100000); if(rand()%2) setConnections(getConnections() | 0b00000100); else setConnections(getConnections() | 0b00001000); if(rand()%2) setConnections(getConnections() | 0b00000001); else setConnections(getConnections() | 0b00000010); } //tries all pieces in box from separator to end and places fitting into matrix. removes fitting piece //use separator if you have to retract to a position //seperator may be bigger than box size, if all puzzle pieces have already been looked at. // it immediately retracts again then (returns -1) unsigned int Puzzle::tryAllPieces(coor myCoor, vector& myBox, unsigned int separator) { for(int i=separator; i& myBox) { #ifdef debug cout << "putting back" << endl; cout << "Old Box: "; printBox(myBox); cout << endl; #endif for(int i = 0; i < myBox.size();i++) { if(myBox[i].getBoxIdentifier()>getPiece(myCoor.m,myCoor.n).getBoxIdentifier()) { myBox.insert(myBox.begin()+i,getPiece(myCoor.m,myCoor.n)); removePiece(myCoor); return i+1; } } //using push back, if the element was the last element in the vector chain myBox.push_back(getPiece(myCoor.m,myCoor.n)); removePiece(myCoor); return myBox.size(); } //checks if the myPart in its current orientation is legal in position m, n bool Puzzle::PlaceOfPartGood(coor myCoor, PuzzlePiece& myPart) { PuzzlePiece negativePart(0); negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m,myCoor.n+1).getConnections() & 0b11000000)); negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m-1,myCoor.n).getConnections() & 0b00110000)); negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m,myCoor.n-1).getConnections() & 0b00001100)); negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m+1,myCoor.n).getConnections() & 0b00000011)); negativePart.shift(2); if ( ( ((((negativePart.getConnections() & 0b11000000) ^ (myPart.getConnections() & 0b11000000)) != 0b00000000) && (((myPart.getConnections() & 0b11000000) != 0b00000000) && (negativePart.getConnections() & 0b11000000) != 0b00000000)) || ((((negativePart.getConnections() & 0b11000000) == 0b11000000) || ((myPart.getConnections() & 0b11000000) == 0b11000000)) && (((myPart.getConnections() & 0b11000000) != 0b00000000) && (negativePart.getConnections() & 0b11000000) != 0b00000000)) || (((negativePart.getConnections() & 0b11000000) == 0b00000000) && ((myPart.getConnections() & 0b11000000) == 0b00000000)) ) && ( ((((negativePart.getConnections() & 0b00110000) ^ (myPart.getConnections() & 0b00110000)) != 0b00000000) && (((myPart.getConnections() & 0b00110000) != 0b00000000) && (negativePart.getConnections() & 0b00110000) != 0b00000000)) || ((((negativePart.getConnections() & 0b00110000) == 0b00110000) || ((myPart.getConnections() & 0b00110000) == 0b00110000)) && (((myPart.getConnections() & 0b00110000) != 0b00000000) && (negativePart.getConnections() & 0b00110000) != 0b00000000)) || (((negativePart.getConnections() & 0b00110000) == 0b00000000) && ((myPart.getConnections() & 0b00110000) == 0b00000000)) ) && ( ((((negativePart.getConnections() & 0b00001100) ^ (myPart.getConnections() & 0b00001100)) != 0b00000000) && (((myPart.getConnections() & 0b00001100) != 0b00000000) && (negativePart.getConnections() & 0b00001100) != 0b00000000)) || ((((negativePart.getConnections() & 0b00001100) == 0b00001100) || ((myPart.getConnections() & 0b00001100) == 0b00001100)) && (((myPart.getConnections() & 0b00001100) != 0b00000000) && (negativePart.getConnections() & 0b00001100) != 0b00000000)) || (((negativePart.getConnections() & 0b00001100) == 0b00000000) && ((myPart.getConnections() & 0b00001100) == 0b00000000)) ) && ( ((((negativePart.getConnections() & 0b00000011) ^ (myPart.getConnections() & 0b00000011)) != 0b00000000) && (((myPart.getConnections() & 0b00000011) != 0b00000000) && (negativePart.getConnections() & 0b00000011) != 0b00000000)) || ((((negativePart.getConnections() & 0b00000011) == 0b00000011) || ((myPart.getConnections() & 0b00000011) == 0b00000011)) && (((myPart.getConnections() & 0b00000011) != 0b00000000) && (negativePart.getConnections() & 0b00000011) != 0b00000000)) || (((negativePart.getConnections() & 0b00000011) == 0b00000000) && ((myPart.getConnections() & 0b00000011) == 0b00000000)) ) ) { //cout << "good Part: "; //myPart.printPiece(); //cout << endl; return 1; } //cout << "bad Part: "; //myPart.printPiece(); //cout << endl; return 0; } //TODO!! //simpler algorithm to the first placeofpartgood //not yet functional!!! bool Puzzle::PlaceOfPart2Good(coor myCoor, PuzzlePiece& myPart) { PuzzlePiece tmpPuzzlePiece = myPart; //make tmp a negative part if(((tmpPuzzlePiece.getConnections() & 0b11000000) != 0b11000000) || ((tmpPuzzlePiece.getConnections() & 0b11000000) != 0b00000000)) tmpPuzzlePiece.setConnections(tmpPuzzlePiece.getConnections() ^ 0b11000000); if(((tmpPuzzlePiece.getConnections() & 0b00110000) != 0b00110000) || ((tmpPuzzlePiece.getConnections() & 0b00110000) != 0b00000000)) tmpPuzzlePiece.setConnections(tmpPuzzlePiece.getConnections() ^ 0b00110000); if(((tmpPuzzlePiece.getConnections() & 0b00001100) != 0b00001100)|| ((tmpPuzzlePiece.getConnections() & 0b00001100) != 0b00000000)) tmpPuzzlePiece.setConnections(tmpPuzzlePiece.getConnections() ^ 0b00001100); if(((tmpPuzzlePiece.getConnections() & 0b00000011) != 0b00000011) || ((tmpPuzzlePiece.getConnections() & 0b00000011) != 0b00000000)) tmpPuzzlePiece.setConnections(tmpPuzzlePiece.getConnections() ^ 0b00000011); PuzzlePiece negativePart(0); negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m,myCoor.n+1).getConnections() & 0b11000000)); negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m-1,myCoor.n).getConnections() & 0b00110000)); negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m,myCoor.n-1).getConnections() & 0b00001100)); negativePart.setConnections(negativePart.getConnections() | (getPiece(myCoor.m+1,myCoor.n).getConnections() & 0b00000011)); negativePart.shift(2); //check tmp part with environment if(((negativePart.getConnections() & 0b11000000) == (tmpPuzzlePiece.getConnections() & 0b11000000)) && ((negativePart.getConnections() & 0b00110000) == (tmpPuzzlePiece.getConnections ()& 0b00110000)) && ((negativePart.getConnections() & 0b00001100) == (tmpPuzzlePiece.getConnections() & 0b00001100)) && ((negativePart.getConnections() & 0b00000011) == (tmpPuzzlePiece.getConnections() & 0b00000011))) return 1; return 0; } //prints the true puzzle (without 0 edges) void Puzzle::printPuzzle() { cout << "current Puzzle: " << endl; for(int i=1;i smallChannels; unsigned int i=0,j=0; for ( int y=0; y<=PuzzlePicture.rows-smallSize.height; y += smallSize.height ) { for ( int x=0 ; x<=PuzzlePicture.cols-smallSize.width; x += smallSize.width ) { //split into different ROIs cv::Rect rect = cv::Rect (x ,y , smallSize.width, smallSize.height ); cv::Mat tmpSmallPicture = cv::Mat(PuzzlePicture,rect); cv::split(tmpSmallPicture, smallChannels); //save color into individual PuzzlePieces in Matrix PuzzlePiece tmpPiece = getPiece(j,i); tmpPiece.r = cv::mean(smallChannels[0]).operator[](0); tmpPiece.g = cv::mean(smallChannels[1]).operator[](0); tmpPiece.b = cv::mean(smallChannels[2]).operator[](0); setPiece(coor(j,i),tmpPiece); j++; } i++; j=0; } } void randomBox::putAllIntoBox() { for (int i = 0; i < getRows(); i++) { for (int j = 0; j < getCols(); j++) { Box.push_back(getPiece(j,i)); } } } //prints a box contents on console void randomBox::printBox() { shuffle(); for (vector::iterator i = Box.begin(); i != Box.end(); i++) { (*i).printPiece(); cout << ' '; } cout << endl; } //shuffles around a box, randomizing pieces and orientation vector randomBox::shuffle() { random_shuffle(Box.begin(),Box.end()); for (vector::iterator i = Box.begin(); i != Box.end(); i++) { i->shift(rand()%4); i->resetShift(); } numerateBox(Box); return Box; } //creates a random box size m, n, shuffles it, and then retuns it vector createBox(coor myCoor) { /* <<<<<<< HEAD randomBox myFirstPuzzleBox(myCoor.m, myCoor.n); myFirstPuzzleBox.createRandomPuzzle(); return myFirstPuzzleBox.shuffle(); ======= */ randomBox myFirstPuzzleBox(myCoor.m,myCoor.n); myFirstPuzzleBox.createRandomAbstraction1(); myFirstPuzzleBox.createRandomAbstraction2(); myFirstPuzzleBox.putAllIntoBox(); myFirstPuzzleBox.printPuzzle(); return myFirstPuzzleBox.shuffle(); //>>>>>>> 9b282e83caf9aaacea107f878d2d6b3f413f286b } //prints contents of box void printBox(vector myBox) { cout << "current Box: " << endl; for (vector::iterator i = myBox.begin(); i != myBox.end(); i++) { (*i).printPiece(); cout << ' '; } cout << endl; return; } //gives every element in box a box identifier. void numerateBox(vector& myBox) { for(int i = 0; i< myBox.size();i++) myBox[i].setBoxIdentifier(i); return; } std::vector convertPart2PuzzlePiece(std::vector simplePartBox) { std::vector advancedPartBox; for(int i=0;i