// Copyright 2005 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef S2_S2COORDS_INTERNAL_H_ #define S2_S2COORDS_INTERNAL_H_ // Author: [email protected] (Eric Veach) namespace S2 { namespace internal { // The canonical Hilbert traversal order looks like an inverted 'U': // the subcells are visited in the order (0,0), (0,1), (1,1), (1,0). // The following tables encode the traversal order for various // orientations of the Hilbert curve (axes swapped and/or directions // of the axes reversed). // Together these flags define a cell orientation. If 'kSwapMask' // is true, then canonical traversal order is flipped around the // diagonal (i.e. i and j are swapped with each other). If // 'kInvertMask' is true, then the traversal order is rotated by 180 // degrees (i.e. the bits of i and j are inverted, or equivalently, // the axis directions are reversed). int constexpr kSwapMask = …; int constexpr kInvertMask = …; // kIJtoPos[orientation][ij] -> pos // // Given a cell orientation and the (i,j)-index of a subcell (0=(0,0), // 1=(0,1), 2=(1,0), 3=(1,1)), return the order in which this subcell is // visited by the Hilbert curve (a position in the range [0..3]). extern int const kIJtoPos[4][4]; // kPosToIJ[orientation][pos] -> ij // // Return the (i,j) index of the subcell at the given position 'pos' in the // Hilbert curve traversal order with the given orientation. This is the // inverse of the previous table: // // kPosToIJ[r][kIJtoPos[r][ij]] == ij extern int const kPosToIJ[4][4]; // kPosToOrientation[pos] -> orientation_modifier // // Return a modifier indicating how the orientation of the child subcell // with the given traversal position [0..3] is related to the orientation // of the parent cell. The modifier should be XOR-ed with the parent // orientation to obtain the curve orientation in the child. extern int const kPosToOrientation[4]; // The U,V,W axes for each face. extern double const kFaceUVWAxes[6][3][3]; // The precomputed neighbors of each face (see GetUVWFace). extern int const kFaceUVWFaces[6][3][2]; } // namespace internal } // namespace S2 #endif // S2_S2COORDS_INTERNAL_H_