Ejemplo n.º 1
0
/**
    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;
}
Ejemplo n.º 2
0
 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)));
   }
 }
Ejemplo n.º 3
0
  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();
      }
    }
  
  }
Ejemplo n.º 4
0
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();

}
Ejemplo n.º 5
0
 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);
 }