static bool mergeRegions(dtLayerRegion& rega, dtLayerRegion& regb) { unsigned short aid = rega.id; unsigned short bid = regb.id; // Duplicate current neighbourhood. dtIntArray acon; acon.resize(rega.connections.size()); for (int i = 0; i < rega.connections.size(); ++i) acon[i] = rega.connections[i]; dtIntArray& bcon = regb.connections; // Find insertion point on A. int insa = -1; for (int i = 0; i < acon.size(); ++i) { if (acon[i] == bid) { insa = i; break; } } if (insa == -1) return false; // Find insertion point on B. int insb = -1; for (int i = 0; i < bcon.size(); ++i) { if (bcon[i] == aid) { insb = i; break; } } if (insb == -1) return false; // Merge neighbours. rega.connections.resize(0); for (int i = 0, ni = acon.size(); i < ni-1; ++i) rega.connections.push(acon[(insa+1+i) % ni]); for (int i = 0, ni = bcon.size(); i < ni-1; ++i) rega.connections.push(bcon[(insb+1+i) % ni]); removeAdjacentNeighbours(rega); rega.cellCount += regb.cellCount; regb.cellCount = 0; rega.border |= regb.border; regb.border = 0; regb.connections.resize(0); return true; }
static bool mergeRegions(rcRegion& rega, rcRegion& regb) { unsigned short aid = rega.id; unsigned short bid = regb.id; // Duplicate current neighbourhood. rcIntArray acon; acon.resize(rega.connections.size()); for (int i = 0; i < rega.connections.size(); ++i) acon[i] = rega.connections[i]; rcIntArray& bcon = regb.connections; // Find insertion point on A. int insa = -1; for (int i = 0; i < acon.size(); ++i) { if (acon[i] == bid) { insa = i; break; } } if (insa == -1) return false; // Find insertion point on B. int insb = -1; for (int i = 0; i < bcon.size(); ++i) { if (bcon[i] == aid) { insb = i; break; } } if (insb == -1) return false; // Merge neighbours. rega.connections.resize(0); for (int i = 0, ni = acon.size(); i < ni-1; ++i) rega.connections.push(acon[(insa+1+i) % ni]); for (int i = 0, ni = bcon.size(); i < ni-1; ++i) rega.connections.push(bcon[(insb+1+i) % ni]); removeAdjacentNeighbours(rega); for (int j = 0; j < regb.floors.size(); ++j) addUniqueFloorRegion(rega, regb.floors[j]); rega.spanCount += regb.spanCount; regb.spanCount = 0; regb.connections.resize(0); return true; }
static void replaceNeighbour(dtLayerRegion& reg, unsigned short oldId, unsigned short newId) { bool neiChanged = false; for (int i = 0; i < reg.connections.size(); ++i) { if (reg.connections[i] == oldId) { reg.connections[i] = newId; neiChanged = true; } } if (neiChanged) removeAdjacentNeighbours(reg); }