// prepare data for testing TautologyChecker::dat *TautologyChecker::parse(const char *input,dat *root,int &i,int &offset){ // build tree, return it bool neg = false; bool isLeaf = false; dat *d = 0; for(;i<strlen(input);i++){ d = 0; switch(input[i]){ case 'N': neg = !neg;break; case '(': i++; //skip d = parse(input,d,i,offset); d->sign = !neg; // allow negating the whole tree neg = false; root = attachNode(root,d,1); break; case ')': continue; // return the subtree default: isLeaf = islower(input[i]); d = new dat; // build new node // new node isn't coming through pristine for some reason... d->left = 0; d->right = 0; d->sign = !neg; neg = false; if(isLeaf){ try{ assignments.at(input[i]); }catch(const std::out_of_range &e){ // value not found assignments[input[i]] = offset; // add assignment map mask |= (1<<offset++); // update mask } d->data = input[i]; }else{ d->data = input[i]; } root = attachNode(root,d,isLeaf); } } return root; };
void QNoLodQuad::build(int centerX, int centexY, int size) { if(m_nLevel >= 2) { m_nLevel--; build(centerX - size / 2, centerY - size / 2, size / 2); build(centerX - size / 2, centerY + size / 2, size / 2); build(centerX + size / 2, centerY + size / 2, size / 2); build(centerX + size / 2, centerY - size / 2, size / 2); } else { attachNode(centerX, centexY); } }
TileMap::TileMap(Game& world, TextureManager& textureManager, const TMX& tmx) : BaseGameEntity(world, b2BodyDef()) , mWorld(world) , mTextures() , mpCollider(nullptr) , mpNavGraph(nullptr) , mDrawFlags(0) , mCellSpaceNeighborhoodRange(1) , mpCellSpacePartition(nullptr) { setDrawOrder(std::numeric_limits<int>::max()); std::vector<std::vector<sf::VertexArray>> layers; tmx.makeVertices(textureManager, mTextures, layers); for (auto it = layers.begin(); it != layers.end(); ++it) { int index = it - layers.begin(); if (it->size() != mTextures.size()) { throw std::runtime_error("Texture and layer component counts are inconsistent."); } auto pLayer = std::make_unique<Layer>(mWorld, std::move(*it), mTextures); pLayer->setDrawOrder(index); attachNode(std::move(pLayer)); } const sf::Transform& transform = getWorld().getPixelToWorldTransform(); mpCollider = std::unique_ptr<CompositeCollider>(tmx.makeCollider(transform)); mpNavGraph = std::unique_ptr<NavGraph>(tmx.makeNavGraph(transform)); mCellSpaceNeighborhoodRange = calculateAverageGraphEdgeLength(*mpNavGraph) + 1; mpCellSpacePartition = std::make_unique<NavCellSpace>((float)tmx.getTileWidth() / tmx.getWidth(), (float)tmx.getTileHeight() * tmx.getHeight(), tmx.getWidth() / 4, tmx.getHeight() / 4, mpNavGraph->numNodes()); TileMap::NavGraph::ConstNodeIterator nodeIter(*mpNavGraph); for (const TileMap::NavGraph::Node* pNode = nodeIter.begin(); !nodeIter.end(); pNode = nodeIter.next()) { mpCellSpacePartition->addEntity(pNode); } std::vector<b2Fixture*> fixtures; mpCollider->createFixtures(getBody(), fixtures); }
//attaches a given suffix to the node //Poor implementation, O(n^2) void SuffixTree::attachSuffix(Node *parent, char * str) { Node * curr = parent; bool placeFound = false; int level = 0; int len = strlen(str); while(!placeFound) { placeFound = true; for(int i = 0; i < curr -> numChildren; i++) { if((curr -> child[i]) -> nodeVal == str[level]) { curr = curr -> child[i]; level += 1; placeFound = false; break; } } } //create a chain now starting from the curr node for(int i = level; i < len; i++) { curr = attachNode(curr, str[i]); } }