Skip to content
Snippets Groups Projects
automaton.cpp 1.77 KiB
Newer Older
Anthony Noir's avatar
Anthony Noir committed
#include "automaton.hpp"

Automaton::Automaton() : alphabet(), grid(0,0), neighbourhoodRule(nullptr), transitionRule(nullptr) {}
Anthony Noir's avatar
Anthony Noir committed

Automaton::~Automaton() {
    delete neighbourhoodRule;
    delete transitionRule;
}

void Automaton::setAlphabet(const Alphabet& A) {
    alphabet = A;
    for(int i=0; i<static_cast<int>(grid.get_col()); ++i) {
        for(int j=0; j<static_cast<int>(grid.get_rows()); ++j) {
            grid.set_cell({i,j}, 0);
Anthony Noir's avatar
Anthony Noir committed
        }
    }
}

void Automaton::setNeighborhoodRule(NeighborhoodRule* NR) {
    delete  neighbourhoodRule;
    neighbourhoodRule = NR;
}

NeighborhoodRule* Automaton::getNeighborhoodRule() const {
    return neighbourhoodRule;
}

void Automaton::setTransitionRule(TransitionRule* TR) {
    delete transitionRule;
    transitionRule = TR;
}

TransitionRule* Automaton::getTransitionRule() const {
    return transitionRule;
}

void Automaton::setCell(const Coord& coord, unsigned int val) {
    grid.set_cell(coord, val%alphabet.taille());
}

const Grid& Automaton::getGrid() const {
    return grid;
}

void Automaton::setGrid(const Grid& G) {
    grid = G;
    unsigned int state;
    for(int i=0; i<static_cast<int>(grid.get_col()); ++i) {
        for(int j=0; j<static_cast<int>(grid.get_rows()); ++j) {
            state = grid.get_state({i,j});
            if(state >= alphabet.taille()) {
                grid.set_cell({i,j}, state%alphabet.taille());
            }
        }
    }
}

void Automaton::runOnce() {
    Grid tempGrid(grid);
    for(int i=0; i<static_cast<int>(grid.get_col()); ++i) {
        for(int j=0; j<static_cast<int>(grid.get_rows()); ++j) {
             tempGrid.set_cell({i, j}, transitionRule->getState(grid.get_state({i,j}),neighbourhoodRule->getNeighborhood(grid, {i, j}))%alphabet.taille());
Anthony Noir's avatar
Anthony Noir committed
        }
    }
    grid = tempGrid;
Anthony Noir's avatar
Anthony Noir committed
}