/** create the Start Variables based on the gamefield given in Constructor * @brief Solver::SatBaseClass::createVars */ void Solver::SatBaseClass::createVars(){ // clear old values varToInt.clear(); intToVar.clear(); // create True and falsevar intToVar.push_back(PosInt(0,0,21210)); intToVar.push_back(PosInt(0,0,121210)); trueVar = 1; falseVar = 2; result << "1 0" << std::endl; result << "-2 0" << std::endl; countClausel = 2; // create Vars uint sizeGameX, sizeGameY; sizeGameX = gameField.getField().getSizeX(); sizeGameY = gameField.getField().getSizeY(); for(const Tile& t: gameField.getTiles()){ for(uint x=0; x<=sizeGameX-t.getSizeX(); ++x){ for(uint y=0; y<=sizeGameY-t.getSizeY(); ++y){ intToVar.push_back(PosInt(x,y,t.getId())); // std::cout << PosInt(x,y,t.getId()) << " -> " << intToVar.size() << std::endl; varToInt.insert(std::pair<PosInt, uint> (PosInt(x,y,t.getId()), intToVar.size())); } } } countVars = intToVar.size(); // true and false are not count countVarsBegin = countVars-2; }
void YaVecArrow::calcPoints(arrowInfo &arrow, const PosInt &tip, double tipAngle, PosInt &pLeft, PosInt &pRight, PosInt &pMid) { double arrAngle = atan(arrow.Width/arrow.Height); tipAngle += M_PI; double length = sqrt(arrow.Width*arrow.Width+arrow.Height*arrow.Height); pLeft = tip+PosInt(static_cast<int>(length*cos(tipAngle+arrAngle)), static_cast<int>(length*sin(tipAngle+arrAngle))); pRight = tip+PosInt(static_cast<int>(length*cos(tipAngle-arrAngle)), static_cast<int>(length*sin(tipAngle-arrAngle))); if (arrow.Type==closed_indented_butt || arrow.Type==closed_pointed_butt) { length *= (arrow.Type==closed_indented_butt) ? 0.666 : 1.333; pMid = tip + PosInt(static_cast<int>(length*cos(tipAngle)), static_cast<int>(length*sin(tipAngle))); } }
void FBox::draw(FigView* view) { PosInt ul, lr; PosInt ur, ll; Array <int, 3> color; ul = elm_upper_left; lr = elm_lower_right; ur = PosInt(lr.xpos(), ul.ypos()); ll = PosInt(ul.xpos(), lr.ypos()); double styleLength = elmStyleValue*15; getPenColorRGB(color); view->drawLine(ul/scale(), ur/scale(), elmThickness, color, elmLineStyle, styleLength/scale()); view->drawLine(ur/scale(), lr/scale(), elmThickness, color, elmLineStyle, styleLength/scale()); view->drawLine(lr/scale(), ll/scale(), elmThickness, color, elmLineStyle, styleLength/scale()); view->drawLine(ll/scale(), ul/scale(), elmThickness, color, elmLineStyle, styleLength/scale()); if (elmAreaFill>=0) { Array<int, 3> fillCol; PosInt left; PosInt right; left = ul/scale(); left.incx(); left.incy(); right = ur/scale(); right.decx(); right.incy(); cout << "BOXR=" << ur.xpos()/scale() << " from " << ur.xpos() << " FILLR=" << right.xpos() << endl; fillCol = actualFillColor(); while (left.ypos() < ll.ypos()/scale()) { view->drawLine(left, right, elmThickness, fillCol, YaVecLine::solid, styleLength/scale()); left.incy(); right.incy(); } } }
void Solver::toSatDebug::createDimacs(const std::string& fileName){ // Exactly One uint sizeX(gameField.getField().getSizeX()); uint sizeY(gameField.getField().getSizeY()); for(const Tile& t: gameField.getTiles()){ std::set<PosInt> buffer; for(uint x=0; x<=sizeX - t.getSizeX(); ++x){ for(uint y=0; y<=sizeY - t.getSizeY(); ++y){ buffer.insert(PosInt(x,y,t.getId())); } } getExactlyOne(buffer); } // Modulo Contraint for(uint fieldX = 0; fieldX < sizeX; ++fieldX){ for(uint fieldY = 0; fieldY < sizeY; ++fieldY){ std::vector<Solver::literal> bufferForVar; for(const Tile& t: gameField.getTiles()){ // Variablen in Buffer Set schreiben std::multiset<Solver::literal> bufferOr; for(uint tileX=0; tileX <= fieldX; ++tileX){ if(tileX + t.getSizeX() > sizeX) break; for(uint tileY=0; tileY<=fieldY; ++tileY){ if(tileY + t.getSizeY() > sizeY) break; if(t.getField( fieldX - tileX, fieldY - tileY)){ Solver::literal lit; lit.positiv = true; lit.varId = varToInt[PosInt(tileX, tileY, t.getId())]; bufferOr.insert(lit); } } } Solver::literal lit; lit.varId =createTseitinOr(bufferOr); lit.positiv = true; bufferForVar.push_back(lit); // Set start value } if(gameField.getField().getField(fieldX,fieldY) != 0){ for(int i=0; i <gameField.getField().getField(fieldX,fieldY); ++i ){ std::cout << "Add: (" << fieldX << ", " << fieldY << ") " << i << " " << (int)gameField.getField().getField(fieldX, fieldY) << std::endl; Solver::literal lit; lit.varId =getTrueVar(); lit.positiv = true; bufferForVar.push_back(lit); } } // generierung der Ausgänge #if COMMENTSDEBUG == 1 result << "c" << std::endl; result << "c Decode at Position (" << fieldX << ", " << fieldY << ")" << std::endl; result << "c" << std::endl; #endif createModuloNAdderHalf(bufferForVar, gameField.getField().getMod()); } } /************************************************************************************************** * Debug * * ***********************************************************************************************/ uint fieldX = 0; uint fieldY = 0; std::vector<Solver::literal> bufferForVar; for(const Tile& t: gameField.getTiles()){ // Variablen in Buffer Set schreiben std::multiset<Solver::literal> bufferOr; for(uint tileX=0; tileX <= fieldX; ++tileX){ if(tileX + t.getSizeX() > sizeX) break; for(uint tileY=0; tileY<=fieldY; ++tileY){ if(tileY + t.getSizeY() > sizeY) break; if(t.getField( fieldX - tileX, fieldY - tileY)){ Solver::literal lit; lit.positiv = true; lit.varId = varToInt[PosInt(tileX, tileY, t.getId())]; bufferOr.insert(lit); } } } Solver::literal lit; lit.varId =createTseitinOr(bufferOr); lit.positiv = true; bufferForVar.push_back(lit); // Set start value } if(gameField.getField().getField(fieldX,fieldY) != 0){ for(int i=0; i <gameField.getField().getField(fieldX,fieldY); ++i ){ std::cout << "Add: (" << fieldX << ", " << fieldY << ") " << i << " " << (int)gameField.getField().getField(fieldX, fieldY) << std::endl; Solver::literal lit; lit.varId =getTrueVar(); lit.positiv = true; bufferForVar.push_back(lit); } } // generierung der Ausgänge #if COMMENTSDEBUG == 1 result << "c" << std::endl; result << "c Decode at Position (" << fieldX << ", " << fieldY << ")" << std::endl; result << "c" << std::endl; #endif createModuloNAdderHalf(bufferForVar, gameField.getField().getMod()); //*/ // write it into file std::fstream data; data.open(fileName, std::ios::out); data << "p cnf " << countVars << " " << countClausel << std::endl; data << result.str().c_str(); data.close(); }
void FBox::getPoints(vector<PosInt> &points, bool hierarchical, bool withCompounds) { points.push_back(elm_upper_left); points.push_back(PosInt(elm_lower_right.xpos(), elm_upper_left.ypos())); points.push_back(PosInt(elm_upper_left.xpos(), elm_lower_right.ypos())); points.push_back(elm_lower_right); }