コード例 #1
0
ファイル: ChartTableGen.cpp プロジェクト: emoratac/devel
QVector<LayerVisualInfo*> ChartTableGen::generateLayerVisualInfoForLayer(QString layerId) {
	QVector<LayerVisualInfo*> tmpLVI;
	int i=0;	// level number
	LayerVisualInfo* tmpInfo;
	QString simpStr = "_level";
	double e=0;
	double maxZoom=0;
	double minZoom=0;
	QString srcTableName;

	for (i = 0; i <= this->getSimpLevelCount(); i++) {
		tmpInfo = new LayerVisualInfo();

		if (this->getSimpLevelCount() > 0) {
			e = this->getEpsilonForLevel(i);
			maxZoom = this->getZoomForLevel(i);
		}

		if (i == 0) {
			// level 0: no simplification, maximum zoom level (= max zoom in)
			if (this->getSimpLevelCount()==0) {
				// and if no other layers, ensure the whole zoom range cover
				minZoom = 0;
			} else {
				minZoom = getMaxZoomLevel();
			}
			maxZoom = (double)LONG_MAX; // --> 2147483647
		} else if (i == this->getSimpLevelCount()) {
			// level = max: heaviest simplification, minimum zoom level (= max zoom out)
			maxZoom = minZoom;
			minZoom = 0;
		} else {
			minZoom = this->getZoomForLevel(i + 1);
		}

		if (i == 0) {
			srcTableName = layerId;		// level 0: original data set with no simplification
		} else {
			srcTableName = layerId + simpStr + QString::number(i);
		}

		tmpInfo->setLayerId(layerId);
		tmpInfo->setZoomMin(minZoom);
		tmpInfo->setZoomMax(maxZoom);
		tmpInfo->setStyleId(0);
		tmpInfo->setSimpLevel(i);
		tmpInfo->setEpsilon(e);
		tmpInfo->setSrcTableName(srcTableName);

		tmpLVI << tmpInfo;
	} // for
	return tmpLVI;
}
コード例 #2
0
size_t
PowerOfSqrtTwoZoomConstraint::getNearestBlockSize(size_t blockSize,
						  int &type, 
						  int &power,
						  RoundingDirection dir) const
{
//    std::cerr << "given " << blockSize << std::endl;

    size_t minCachePower = getMinCachePower();

    if (blockSize < (1U << minCachePower)) {
	type = -1;
	power = 0;
	float val = 1.0, prevVal = 1.0;
	while (val + 0.01 < blockSize) {
	    prevVal = val;
	    val *= sqrt(2.f);
	}
	size_t rval;
	if (dir == RoundUp) rval = size_t(val + 0.01);
	else if (dir == RoundDown) rval = size_t(prevVal + 0.01);
	else if (val - blockSize < blockSize - prevVal) rval = size_t(val + 0.01);
	else rval = size_t(prevVal + 0.01);
//	SVDEBUG << "returning " << rval << endl;
	return rval;
    }

    unsigned int prevBase = (1 << minCachePower);
    unsigned int prevPower = minCachePower;
    unsigned int prevType = 0;

    size_t result = 0;

    for (unsigned int i = 0; ; ++i) {

	power = minCachePower + i/2;
	type = i % 2;

	unsigned int base;
	if (type == 0) {
	    base = (1 << power);
	} else {
	    base = (((unsigned int)((1 << minCachePower) * sqrt(2.) + 0.01))
		    << (power - minCachePower));
	}

//	SVDEBUG << "Testing base " << base << endl;

        if (base == blockSize) {
            result = base;
            break;
        }

	if (base > blockSize) {
	    if (dir == RoundNearest) {
		if (base - blockSize < blockSize - prevBase) {
		    dir = RoundUp;
		} else {
		    dir = RoundDown;
		}
	    }
	    if (dir == RoundUp) {
		result = base;
		break;
	    } else {
		type = prevType;
		power = prevPower;
		result = prevBase;
		break;
	    }
	}

	prevType = type;
	prevPower = power;
	prevBase = base;
    }

    if (result > getMaxZoomLevel()) result = getMaxZoomLevel();
    return result;
}