void QuadTree_S::Compress(char * filename, const int &lineSkip, long long size, BitString * result) { std::vector<long long> quadStrings; std::ifstream fin(filename); std::string line; int x, y; for (int i = 0; i < lineSkip; ++i) std::getline(fin, line); while (std::getline(fin, line)) { std::stringstream ss(line); ss >> x >> y; quadStrings.push_back(GetQuadString(size, x, y)); } std::sort(quadStrings.begin(), quadStrings.end()); long long currentString = GetQuadString(size, 0, 0); long long depth = LogFour(currentString); BitString * depthStrings = new BitString[depth]; long long * depthSizes = new long long[depth]; for (int i = 0; i < depth; ++i) depthSizes[i] = 0; long long dCommon, upQuad, upString, upCommon; dCommon = DeepestCommonQuad(depth, currentString, quadStrings[0]); upQuad = QuadAtDepth(quadStrings[0], depth - dCommon - 1); upString = StripNQuads(quadStrings[0], depth - dCommon - 1) - 1; upCommon = DeepestCommonQuad(depth, currentString, upString); if (currentString <= upString) { for (long long d = upCommon; d >= dCommon; --d) { long long curQuad = QuadAtDepth(currentString, depth - d - 1); long long upQuad = QuadAtDepth(upString, depth - d - 1); for (long long q = curQuad; q <= upQuad; ++q) { depthStrings[d].AppendBit(0); depthStrings[d].AppendBit(0); ++depthSizes[d]; } if (upQuad == 3) { for (long long y = d; y >= 1; --y) { if (!Compress(depthStrings, depthSizes, y)) break; } } } } currentString = upString + 1; if (currentString < quadStrings[0]) { for (long long d = dCommon; d < depth; ++d) { long long curQuad = QuadAtDepth(currentString, depth - d - 1); long long edgeQuad = QuadAtDepth(quadStrings[0], depth - d - 1); for (long long q = curQuad; q < edgeQuad; ++q) { depthStrings[d].AppendBit(0); depthStrings[d].AppendBit(0); ++depthSizes[d]; } if (edgeQuad == 3) Compress(depthStrings, depthSizes, d); } currentString = quadStrings[0]; } depthStrings[depth-1].AppendBit(0); depthStrings[depth-1].AppendBit(1); ++depthSizes[depth-1]; for (long long d = depth - 1; d >= 1; --d) { if (!Compress(depthStrings, depthSizes, d)) break; } for (int i = 1; i < quadStrings.size(); ++i) { dCommon = DeepestCommonQuad(depth, currentString, quadStrings[i]); upQuad = QuadAtDepth(quadStrings[i], depth - dCommon - 1); upString = StripNQuads(quadStrings[i], depth - dCommon - 1) - 1; upCommon = DeepestCommonQuad(depth, currentString, upString); if (currentString < upString) { for (long long d = depth - 1; d >= dCommon; --d) { long long curQuad = QuadAtDepth(currentString, depth - d - 1); long long upQuad = QuadAtDepth(upString, depth - d - 1); for (int q = curQuad; q < upQuad; ++q) { depthStrings[d].AppendBit(0); depthStrings[d].AppendBit(0); ++depthSizes[d]; } if (upQuad == 3 && upQuad != curQuad) { for (long long y = d; y >= 1; --y) { if (!Compress(depthStrings, depthSizes, y)) break; } } } } currentString = upString + 1; if (currentString < quadStrings[i]) { for (long long d = dCommon; d < depth; ++d) { long long curQuad = QuadAtDepth(currentString, depth - d - 1); long long edgeQuad = QuadAtDepth(quadStrings[i], depth - d - 1); for (long long q = curQuad; q < edgeQuad; ++q) { depthStrings[d].AppendBit(0); depthStrings[d].AppendBit(0); ++depthSizes[d]; } if (edgeQuad == 3 && edgeQuad != curQuad) { for (long long y = d; y >= 1; --y) { if (!Compress(depthStrings, depthSizes, y)) break; } } } currentString = quadStrings[i]; } depthStrings[depth-1].AppendBit(0); depthStrings[depth-1].AppendBit(1); ++depthSizes[depth-1]; for (long long d = depth - 1; d >= 1; --d) { if (!Compress(depthStrings, depthSizes, d)) break; } } currentString = quadStrings.back(); long long endString = GetQuadString(size, size - 1, size - 1); dCommon = DeepestCommonQuad(depth, currentString, endString); if (currentString < endString) { for (long long d = depth - 1; d >= 0; --d) { long long curQuad = QuadAtDepth(currentString, depth - d - 1); long long upQuad = QuadAtDepth(endString, depth - d - 1); for (long long q = curQuad; q < upQuad; ++q) { depthStrings[d].AppendBit(0); depthStrings[d].AppendBit(0); ++depthSizes[d]; } if (upQuad == 3 && curQuad != upQuad) { for (long long y = d; y >= 1; --y) { if (!Compress(depthStrings, depthSizes, y)) break; } } } } result->Init(0); BitString tmp; DeltaCode delta; delta.EncodeInt(size, &tmp); result->AppendBitString(tmp); result->AppendBit(1); result->AppendBit(1); for (int i = 0; i < depth; ++i) { result->AppendBitString(depthStrings[i]); } result->PrintRUSAGE(); }
void WorldSession::SendTrainerList( uint64 guid ) { std::string str = GetQuadString(LANG_NPC_TAINER_HELLO); SendTrainerList( guid, str ); }