コード例 #1
0
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();
}
コード例 #2
0
ファイル: NPCHandler.cpp プロジェクト: artas/quademu
void WorldSession::SendTrainerList( uint64 guid )
{
    std::string str = GetQuadString(LANG_NPC_TAINER_HELLO);
    SendTrainerList( guid, str );
}