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