VOID cPOLYGON_SPLITTER::SplitLoopAtDiagonal(BOOL diagonalPointsAreCoincident) { INT diagonal0Index = *m_diagonal0IndexIterator; INT diagonal1Index = *m_diagonal1IndexIterator; if (Debug()){ printf("diagonal0 %d; diagonal1 %d\n", diagonal0Index, diagonal1Index); PrintIndices(); } std::list<INT>::iterator it; if (diagonalPointsAreCoincident) it = InsertIndexBefore(m_diagonal0IndexIterator, END_LOOP_INDEX); else it = InsertIndexBefore(InsertIndexBefore(m_diagonal0IndexIterator, END_LOOP_INDEX), diagonal0Index); if (Debug()) PrintIndices(); if (m_diagonal0IndexIterator == m_frontLoopIterator) m_frontLoopIterator = it; if (Debug()) PrintIndices(); if (diagonalPointsAreCoincident) it = InsertIndexBefore(m_diagonal1IndexIterator, END_LOOP_INDEX); else it = InsertIndexBefore(InsertIndexBefore(m_diagonal1IndexIterator, END_LOOP_INDEX), diagonal1Index); if (Debug()) PrintIndices(); if (m_diagonal1IndexIterator == m_frontLoopIterator) m_frontLoopIterator = it; if (Debug()) PrintIndices(); //the first loop is split between the beginning and the end of the loop //move the indices from the front to the back of the current loop while (true){ INT firstIndex = *m_frontLoopIterator; std::list<INT>::iterator tempBack = m_backLoopIterator; tempBack++; if (firstIndex >= 0 || (*tempBack) >= 0){ InsertIndexAfter(m_backLoopIterator, firstIndex); m_backLoopIterator++; if (Debug()) PrintIndices(); } std::list<INT>::iterator tempFront = m_frontLoopIterator; m_frontLoopIterator++; m_indices.erase(tempFront); if (Debug()) PrintIndices(); if (firstIndex < 0) break; } if (m_indices.back() >= 0) m_indices.push_back(END_LOOP_INDEX); if (Debug()) PrintIndices(); }
int main() { Grid<int> testGrid(5, 3, 7); for (Grid<int>::dimension_type x = 0; x < testGrid.GetColumnCount(); x++) { for (Grid<int>::dimension_type y = 0; y < testGrid.GetRowCount(); y++) { testGrid.GetCell(x, y) = std::rand() % 80 + 1; } } PrintIndices(testGrid); for (Grid<int>::dimension_type i = 0; i < testGrid.columnCount * testGrid.rowCount; i++) { std::cout << testGrid.grid_data[i] << std::endl; } std::cout << "Check Value: " << testGrid[2][1] << std::endl; std::cout << "Check Value Method: " << testGrid.GetCell(2, 1) << std::endl; testGrid.ResizeGridPreserveData(8, 5, 9); printf("\n"); std::cout << testGrid << std::endl; getchar(); return 0; }
VOID cPOLYGON_SPLITTER::SplitLoop() { if (Debug()){ PrintPoints(); PrintIndices(); } if (LoopContainsCoincidentVertices()){ SplitLoopAtDiagonal(true); if (Debug()) PrintIndices(); } else if (!PrepareLoop()){ //loop needs to be split FindDiagonal(); SplitLoopAtDiagonal(); if (Debug()) PrintIndices(); } }