File: box.h

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (133 lines) | stat: -rw-r--r-- 4,398 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef SQL_GIS_BOX_H_INCLUDED
#define SQL_GIS_BOX_H_INCLUDED

// Copyright (c) 2017, 2025, Oracle and/or its affiliates.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, version 2.0,
// as published by the Free Software Foundation.
//
// This program is designed to work with certain software (including
// but not limited to OpenSSL) that is licensed under separate terms,
// as designated in a particular file or component or in included license
// documentation.  The authors of MySQL hereby grant you an additional
// permission to link the program and your derivative works with the
// separately licensed software that they have either included with
// the program or referenced in the documentation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License, version 2.0, for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA.

/// @file
///
/// This file declares the Box class.
///
/// @see box_cs.h

#include "sql/gis/geometries.h"
#include "sql/gis/geometries_cs.h"

namespace gis {

/// A 2d box with sides parallel to the coordinate system grid.
///
/// Used by computations on minimum bounding boxes (MBRs).
class Box {
 public:
  Box() = default;
  Box(const Box &) = default;
  Box(Box &&) = default;
  Box &operator=(const Box &) = default;
  Box &operator=(Box &&) = default;

  virtual ~Box() = default;

  /// Gets the coordinate system.
  ///
  /// @return The coordinate system type.
  virtual Coordinate_system coordinate_system() const = 0;

  /// Returns the minimum corner.
  ///
  /// @return The minimum corner.
  virtual Point const &min_corner() const = 0;
  virtual Point &min_corner() = 0;

  /// Returns the maximum corner.
  ///
  /// @return The maximum corner.
  virtual Point const &max_corner() const = 0;
  virtual Point &max_corner() = 0;
};

/// A Cartesian 2d box.
class Cartesian_box : public Box {
 private:
  /// The corner with minimum X and Y values.
  Cartesian_point m_min_corner;
  /// The corner with maximum X and Y values.
  Cartesian_point m_max_corner;

 public:
  Cartesian_box() = default;
  Cartesian_box(Cartesian_point &&min_corner, Cartesian_point &&max_corner)
      : m_min_corner(min_corner), m_max_corner(max_corner) {}
  Coordinate_system coordinate_system() const override {
    return Coordinate_system::kCartesian;
  }

  /// Returns the minimum corner.
  ///
  /// @return The minimum corner.
  Cartesian_point const &min_corner() const override { return m_min_corner; }
  Cartesian_point &min_corner() override { return m_min_corner; }

  /// Returns the maximum corner.
  ///
  /// @return The maximum corner.
  Cartesian_point const &max_corner() const override { return m_max_corner; }
  Cartesian_point &max_corner() override { return m_max_corner; }
};

/// A Geographic 2d box.
///
/// Unlike polygons, the sides of the box are not the shortest distance between
/// the endpoints. A box side will follow the latitude line, while a linestring
/// (or polygon segment) between the same points won't.
class Geographic_box : public Box {
 private:
  /// The corner with minimum X and Y values.
  Geographic_point m_min_corner;
  /// The corner with maximum X and Y values.
  Geographic_point m_max_corner;

 public:
  Geographic_box() = default;
  Geographic_box(Geographic_point &&min_corner, Geographic_point &&max_corner)
      : m_min_corner(min_corner), m_max_corner(max_corner) {}
  Coordinate_system coordinate_system() const override {
    return Coordinate_system::kGeographic;
  }

  /// Returns the minimum corner.
  ///
  /// @return The minimum corner.
  Geographic_point const &min_corner() const override { return m_min_corner; }
  Geographic_point &min_corner() override { return m_min_corner; }

  /// Returns the maximum corner.
  ///
  /// @return The maximum corner.
  Geographic_point const &max_corner() const override { return m_max_corner; }
  Geographic_point &max_corner() override { return m_max_corner; }
};

}  // namespace gis

#endif  // SQL_GIS_BOX_H_INCLUDED