void LGraph::Layout(unsigned int number_of_iterations, bool do_transpose, int transpose_range){ list<pEdge> ReverseEdges; FindReverseEdges(ReverseEdges); ReverseReverseEdges(ReverseEdges); InitRank(); list<pEdge> LongEdges; FindLongEdges(LongEdges); AddDummyNodes(LongEdges); ReverseEdges.clear(); order = new Ordering(); order->order_vector = InitOrder(); // Number of iterations. layouted = true; for (unsigned int i = 0; i < number_of_iterations; i++) { WeightedMedianHeuristic(i); // TODO(Kuzmich(svatoslav1)): make transpose faster. It is too slow for now if (do_transpose) Transpose(i + transpose_range); } InitPos(order); InitCoordinates(order); #ifdef DEBUG printf("Crossings:%d\n",countCrossing(order)); #endif }
void LGraph::Transpose(int max){ if(!layouted) Layout(0,0,0); bool improved = true; for (int j = 1; j < max; j++){ improved = true; while (improved){ improved = false; for (unsigned int r = 1; r < order->order_vector.size(); r++){ for (unsigned int i = 0; order->order_vector[r].size()>j && i < order->order_vector[r].size() - (j+1); i++){ pLNode v = order->order_vector[r][i]; pLNode w = order->order_vector[r][i+j]; InitPos(order); int cross0 = countCrossingOnRank(order, r) + countCrossingOnRank(order, r-1); v->pos+=j; w->pos-=j; int cross1 = countCrossingOnRank(order, r) + countCrossingOnRank(order, r-1); if (cross1 < cross0){ improved = true; order->order_vector[r][i] = w; order->order_vector[r][i + j] = v; } } } } } }
void initGame() { livelli=InitPos(); ch_index=InitPers(); return; }
void LGraph::WeightedMedianHeuristic(int iter){ if(!layouted) Layout(0,0,0); Ordering temp_order; temp_order.order_vector = order->order_vector; if (iter % 2 == 0) { for(unsigned int r = 1; r <= maxrank; r++ ){ for(unsigned int i = 0;i < temp_order.order_vector[r].size(); i++) { temp_order.order_vector[r][i]->median = temp_order.order_vector[r][i]->Median(*order,MEDIAN_IN); } /// Sort temp_order using ComparePointer comparator sort(temp_order.order_vector[r].begin(), temp_order.order_vector[r].end(), ComparePointer); } } else { for(int r = maxrank - 1; r >= 0; r-- ){ for(unsigned int i = 0;i < temp_order.order_vector[r].size(); i++) { temp_order.order_vector[r][i]->median = temp_order.order_vector[r][i]->Median(*order,MEDIAN_OUT); } sort(temp_order.order_vector[r].begin(), temp_order.order_vector[r].end(), ComparePointer); } } InitPos(&temp_order); int cross_temp_order = countCrossing(&temp_order); InitPos(order); int cross_order = countCrossing(order); if (cross_temp_order <= cross_order){ order->order_vector = temp_order.order_vector; } }
const CUILine* CUILine::CutByLength(CGameFont* pFont, float length, BOOL cut_word) { R_ASSERT(GetSize() > 0); // if first sub line is void then delete it Position pos; InitPos(pos); if (!pos.word_1.exist()) // void string { if (m_subLines[0].m_last_in_line) { m_subLines.erase(m_subLines.begin()); return GetEmptyLine(); } else { m_subLines.erase(m_subLines.begin()); InitPos(pos); } } float len2w1 = GetLength_inclusiveWord_1(pos, pFont); //. * scale; bacause of our fonts not scaled if (!pos.word_2.exist()) { if (cut_word && len2w1 > length) return CutWord(pFont, length); else return Cut2Pos(pos); } float len2w2 = GetLength_inclusiveWord_2(pos, pFont); if (len2w1 > length) { if (cut_word) return CutWord(pFont, length); else return Cut2Pos(pos); } else if (len2w1 <= length && len2w2 > length) { // cut whole first word return Cut2Pos(pos); // all right :) } else // if (len2w1 > length && len2w2 > length) { while (IncPos(pos)) { len2w1 = GetLength_inclusiveWord_1(pos, pFont); if(!pos.word_2.exist()) { return Cut2Pos(pos); } len2w2 = GetLength_inclusiveWord_2(pos, pFont); if (len2w1 <= length && len2w2 > length) return Cut2Pos(pos); } return Cut2Pos(pos, false); } }