// -----------------------------------------------------------------------------
// CAknPhysicsRestrictor::PositionToViewTop()
// -----------------------------------------------------------------------------
//
void CAknPhysicsRestrictor::PositionToViewTop( TPoint& aPosition ) const
    {
    TInt topPos( ViewTopPosition() );
    if ( iLandscape )
        {
        aPosition.iX = topPos;
        }
    else
        {
        aPosition.iY = topPos;
        }
    }
// Interpolating between the 4 vertices of the square
float HeightNode::evalHeight(Vertex2D & pos,
			     int effMapSize,
			     Biome* biomeMap) {
    // Getting the required informations
    Vertex2D tlPos = topLeftData.getPosition();		
    Vertex2D brPos = bottomRightData.getPosition();
    
    Biome tlBiome = topLeftData.getBiome();
    Biome trBiome = topRightData.getBiome();
    Biome blBiome = bottomLeftData.getBiome();
    Biome brBiome = bottomRightData.getBiome();

    float tlHeight = topLeftData.getHeight();
    float trHeight = topRightData.getHeight();
    float blHeight = bottomLeftData.getHeight();
    float brHeight = bottomRightData.getHeight();
    
    // Computing the local coordinates to interpolate
    float x    = pos.first   - tlPos.first;
    float xMax = brPos.first - tlPos.first;

    float y    = pos.second   - brPos.second;
    float yMax = tlPos.second - brPos.second;

    // Interpolation coefficients to compute
    float u, uTop, uBottom, v, vLeft, vRight;

    /*
     * We do here a kind of distorted bilinear interpolation to compute
     * the height of a point given the height of the four vertices
     * of the square the point is in.
     *
     * Indeed, unlike the classical bilinear interpolation where the
     * four vertices have a symetric role, there, the four vertices are
     * charaterized by their nature (ie their biome).
     * Whereas a beach or a plain can be extended, thus affect the whole
     * square, a mountain must have a very local influence ie it must 
     * not turn the surrounding plains into green mountains.
     * 
     * Thus we compute the interpolation using the following strategy
     * that consider the four biomes.
     *
     *    TL----uTop-------TR
     *    |                |
     *  vLeft    X       vRight
     *    |                |             ^ y
     *    |                |             |
     *    BL----uBot-------BR            |__> x
     *
     * 1) The four coefficients on the previous schema are computed
     *    ie an interpolation is done on each edge according to the rules
     *    explained in MapUtils   
     * 2) We use these coefficients to interpolate a height on each edge
     * 3) Then we interpolate on each axis :
     *         heightVertical(heightTop, heightBottom)
     *         heightHorizontal(heightLeft, heightRight)
     * 4) Finally we interpolate between the two heights
     */   

    // Interpolating on each edge
    // Left side
    vLeft = computeInterpolationCoefficient(m_mapParameters, blBiome, tlBiome, y, yMax);
    float leftHeight  = vLeft   * (blHeight) + (1 - vLeft)   * (tlHeight);
    // Right side
    vRight = computeInterpolationCoefficient(m_mapParameters, brBiome, trBiome, y, yMax);
    float rightHeight = vRight  * (brHeight) + (1 - vRight)  * (trHeight);
    // Top side
    uTop = computeInterpolationCoefficient(m_mapParameters, tlBiome, trBiome, x, xMax);
    float topHeight   = uTop    * (tlHeight) + (1 - uTop)    * (trHeight);
    // Bottom side
    uBottom = computeInterpolationCoefficient(m_mapParameters, blBiome, brBiome, x, xMax);
    float botHeight   = uBottom * (blHeight) + (1 - uBottom) * (brHeight);

    // Interpolating on each axis
    // Vertical axis   
    Vertex2D botPos(pos.first, brPos.second);
    Biome    botBiome = findApproximativeBiome(botPos, effMapSize, biomeMap, m_mapParameters.getHeightmapScaling());                   
    Vertex2D topPos(pos.first, tlPos.second);
    Biome    topBiome = findApproximativeBiome(topPos, effMapSize, biomeMap, m_mapParameters.getHeightmapScaling());          
    u = computeInterpolationCoefficient(m_mapParameters, botBiome, topBiome, y, yMax);
  float vertHeight = u * botHeight  + (1 - u) * topHeight; 
    // Horizontal axis
    Vertex2D leftPos(tlPos.first, pos.second);
    Biome    leftBiome = findApproximativeBiome(leftPos, effMapSize, biomeMap, m_mapParameters.getHeightmapScaling());
    Vertex2D rightPos(brPos.first, pos.second); 
    Biome    rightBiome = findApproximativeBiome(rightPos, effMapSize, biomeMap, m_mapParameters.getHeightmapScaling());
    v = computeInterpolationCoefficient(m_mapParameters, leftBiome, rightBiome, x, xMax);
    float horiHeight = v * leftHeight + (1 - v) * rightHeight;
    
    return 0.5f*(vertHeight + horiHeight);
}