void SATGroup::_BottomNeighbours(WindowAreaList& neighbourWindows, WindowArea* parent) { float startPos = parent->LeftBottomCrossing()->VerticalTab()->Position(); float endPos = parent->RightBottomCrossing()->VerticalTab()->Position(); Tab* tab = parent->LeftBottomCrossing()->HorizontalTab(); const CrossingList* crossingList = tab->GetCrossingList(); for (int i = 0; i < crossingList->CountItems(); i++) { Corner* corner = crossingList->ItemAt(i)->LeftBottomCorner(); if (corner->status != Corner::kUsed) continue; WindowArea* area = corner->windowArea; float pos1 = area->LeftBottomCrossing()->VerticalTab()->Position(); float pos2 = area->RightBottomCrossing()->VerticalTab()->Position(); if (pos1 < endPos && pos2 > startPos) neighbourWindows.AddItem(area); if (pos2 > endPos) break; } }
bool SATGroup::_FindConnectedGroup(WindowAreaList& seedList, WindowArea* removedArea, WindowAreaList& newGroup) { if (seedList.CountItems() == 0) return false; WindowArea* area = seedList.RemoveItemAt(0); newGroup.AddItem(area); _FollowSeed(area, removedArea, seedList, newGroup); return true; }
void SATGroup::_FollowSeed(WindowArea* area, WindowArea* veto, WindowAreaList& seedList, WindowAreaList& newGroup) { WindowAreaList neighbours; _FillNeighbourList(neighbours, area); for (int i = 0; i < neighbours.CountItems(); i++) { WindowArea* currentArea = neighbours.ItemAt(i); if (currentArea != veto && !newGroup.HasItem(currentArea)) { newGroup.AddItem(currentArea); // if we get a area from the seed list it is not a seed any more seedList.RemoveItem(currentArea); } else { // don't _FollowSeed of invalid areas neighbours.RemoveItemAt(i); i--; } } for (int i = 0; i < neighbours.CountItems(); i++) _FollowSeed(neighbours.ItemAt(i), veto, seedList, newGroup); }