| 1 | // Copyright 2005 Google Inc. All Rights Reserved. |
| 2 | |
| 3 | #ifndef UTIL_GEOMETRY_S2REGION_H_ |
| 4 | #define UTIL_GEOMETRY_S2REGION_H_ |
| 5 | |
| 6 | #include "s2.h" |
| 7 | |
| 8 | class Decoder; |
| 9 | class Encoder; |
| 10 | |
| 11 | class S2Cap; |
| 12 | class S2Cell; |
| 13 | class S2LatLngRect; |
| 14 | |
| 15 | // An S2Region represents a two-dimensional region over the unit sphere. |
| 16 | // It is an abstract interface with various concrete subtypes. |
| 17 | // |
| 18 | // The main purpose of this interface is to allow complex regions to be |
| 19 | // approximated as simpler regions. So rather than having a wide variety |
| 20 | // of virtual methods that are implemented by all subtypes, the interface |
| 21 | // is restricted to methods that are useful for computing approximations. |
| 22 | class S2Region { |
| 23 | public: |
| 24 | virtual ~S2Region(); |
| 25 | |
| 26 | // Return a deep copy of this region. If you want to narrow the result to a |
| 27 | // specific known region type, use down_cast<T*> from basictypes.h. |
| 28 | // Subtypes return pointers to that subtype from their Clone() methods. |
| 29 | virtual S2Region* Clone() const = 0; |
| 30 | |
| 31 | // Return a bounding spherical cap. This is not guaranteed to be exact. |
| 32 | virtual S2Cap GetCapBound() const = 0; |
| 33 | |
| 34 | // Return a bounding latitude-longitude rectangle that contains the region. |
| 35 | // The bounds are not guaranteed to be tight. |
| 36 | virtual S2LatLngRect GetRectBound() const = 0; |
| 37 | |
| 38 | // If this method returns true, the region completely contains the given |
| 39 | // cell. Otherwise, either the region does not contain the cell or the |
| 40 | // containment relationship could not be determined. |
| 41 | virtual bool Contains(S2Cell const& cell) const = 0; |
| 42 | |
| 43 | // If this method returns false, the region does not intersect the given |
| 44 | // cell. Otherwise, either region intersects the cell, or the intersection |
| 45 | // relationship could not be determined. |
| 46 | virtual bool MayIntersect(S2Cell const& cell) const = 0; |
| 47 | |
| 48 | // Return true if and only if the given point is contained by the region. |
| 49 | // The point 'p' is generally required to be unit length, although some |
| 50 | // subtypes may relax this restriction. |
| 51 | // NOTE: If you will be calling this function on one specific subtype only, |
| 52 | // or if performance is a consideration, please use the non-virtual |
| 53 | // method Contains(S2Point const& p) declared below! |
| 54 | virtual bool VirtualContainsPoint(S2Point const& p) const = 0; |
| 55 | |
| 56 | // Use encoder to generate a serialized representation of this region. |
| 57 | // Assumes that encoder can be enlarged using calls to Ensure(int). |
| 58 | // |
| 59 | // The representation chosen is left up to the sub-classes but it should |
| 60 | // satisfy the following constraints: |
| 61 | // - It should encode a version number. |
| 62 | // - It should be deserializable using the corresponding Decode method. |
| 63 | // - Performance, not space, should be the chief consideration. Encode() and |
| 64 | // Decode() should be implemented such that the combination is equivalent |
| 65 | // to calling Clone(). |
| 66 | virtual void Encode(Encoder* const encoder) const = 0; |
| 67 | |
| 68 | // Reconstruct a region from the serialized representation generated by |
| 69 | // Encode(). Note that since this method is virtual, it requires that a |
| 70 | // Region object of the appropriate concrete type has already been |
| 71 | // constructed. It is not possible to decode regions of unknown type. |
| 72 | // |
| 73 | // Whenever the Decode method is changed to deal with new serialized |
| 74 | // representations, it should be done so in a manner that allows for |
| 75 | // older versions to be decoded i.e. the version number in the serialized |
| 76 | // representation should be used to decide how to decode the data. |
| 77 | // |
| 78 | // Returns true on success. |
| 79 | virtual bool Decode(Decoder* const decoder) = 0; |
| 80 | |
| 81 | // Provide the same functionality as Decode, except that decoded regions are |
| 82 | // allowed to point directly into the Decoder's memory buffer rather than |
| 83 | // copying the data. This method can be much faster for regions that have |
| 84 | // a lot of data (such as polygons), but the decoded region is only valid |
| 85 | // within the scope (lifetime) of the Decoder's memory buffer. |
| 86 | // Default implementation just calls Decode. |
| 87 | virtual bool DecodeWithinScope(Decoder* const decoder); |
| 88 | |
| 89 | ///////////////////////////////////////////////////////////////////////// |
| 90 | // The following are NON-VIRTUAL methods (for efficiency reasons) that |
| 91 | // happen to be implemented by all subclasses. You cannot call these |
| 92 | // methods unless you have an object of a particular subtype. |
| 93 | // |
| 94 | // bool Contains(S2Point const& p) const; |
| 95 | // |
| 96 | // Return true if and only if the given point is contained by the region. |
| 97 | // The point 'p' is generally required to be unit length, although some |
| 98 | // subtypes may relax this restriction. |
| 99 | }; |
| 100 | |
| 101 | #endif // UTIL_GEOMETRY_S2REGION_H_ |
| 102 | |