GEOS 3.14.0dev
Depth.h
1/**********************************************************************
2 *
3 * GEOS - Geometry Engine Open Source
4 * http://geos.osgeo.org
5 *
6 * Copyright (C) 2005-2006 Refractions Research Inc.
7 * Copyright (C) 2001-2002 Vivid Solutions Inc.
8 *
9 * This is free software; you can redistribute and/or modify it under
10 * the terms of the GNU Lesser General Public Licence as published
11 * by the Free Software Foundation.
12 * See the COPYING file for more information.
13 *
14 **********************************************************************
15 *
16 * Last port: geomgraph/Depth.java rev. 1.4 (JTS-1.10)
17 *
18 **********************************************************************/
19
20
21#pragma once
22
23#include <geos/export.h>
24#include <geos/geom/Location.h>
25#include <geos/geom/Position.h>
26#include <string>
27#include <cstdint>
28
29// Forward declarations
30namespace geos {
31namespace geomgraph {
32class Label;
33}
34}
35
36namespace geos {
37namespace geomgraph { // geos.geomgraph
38
41class GEOS_DLL Depth {
42
43private:
44
45 static constexpr int NULL_VALUE = -1; // Replaces NULL
46
47 int depth[2][3];
48
49
50public:
51
52 static int depthAtLocation(geom::Location location)
53 {
54 if(location == geom::Location::EXTERIOR) {
55 return 0;
56 }
57 if(location == geom::Location::INTERIOR) {
58 return 1;
59 }
60 return NULL_VALUE;
61 };
62
63
64 Depth()
65 {
66 // initialize depth array to a sentinel value
67 for(std::size_t i = 0; i < 2; i++) {
68 for(std::size_t j = 0; j < 3; j++) {
69 depth[i][j] = NULL_VALUE;
70 }
71 }
72 };
73
74 virtual ~Depth() = default; // FIXME: shouldn't be virtual!
75
76 int getDepth(int geomIndex, int posIndex) const
77 {
78 return depth[geomIndex][posIndex];
79 };
80
81 void setDepth(int geomIndex, int posIndex, int depthValue)
82 {
83 depth[geomIndex][posIndex] = depthValue;
84 };
85
86 geom::Location getLocation(int geomIndex, int posIndex) const
87 {
88 if(depth[geomIndex][posIndex] <= 0) {
89 return geom::Location::EXTERIOR;
90 }
91 return geom::Location::INTERIOR;
92 };
93
94 void add(int geomIndex, int posIndex, geom::Location location)
95 {
96 if(location == geom::Location::INTERIOR) {
97 depth[geomIndex][posIndex]++;
98 }
99 };
100
104 bool isNull() const
105 {
106 for(std::size_t i = 0; i < 2; i++) {
107 for(std::size_t j = 0; j < 3; j++) {
108 if(depth[i][j] != NULL_VALUE) {
109 return false;
110 }
111 }
112 }
113 return true;
114 };
115
116 bool isNull(uint8_t geomIndex) const
117 {
118 return depth[geomIndex][1] == NULL_VALUE;
119 };
120
121 bool isNull(uint8_t geomIndex, uint8_t posIndex) const
122 {
123 return depth[geomIndex][posIndex] == NULL_VALUE;
124 };
125
126 int getDelta(int geomIndex) const
127 {
128 return depth[geomIndex][geom::Position::RIGHT] - depth[geomIndex][geom::Position::LEFT];
129 };
130
131 void normalize();
132
133 void add(const Label& lbl);
134
135 std::string toString() const;
136
137
138};
139
140
141} // namespace geos.geomgraph
142} // namespace geos
143
A Depth object records the topological depth of the sides of an Edge for up to two Geometries.
Definition Depth.h:41
bool isNull() const
Definition Depth.h:104
A Label indicates the topological relationship of a component of a topology graph to a given Geometry...
Definition Label.h:57
Location
Constants representing the location of a point relative to a geometry.
Definition Location.h:32
Basic namespace for all GEOS functionalities.
Definition geos.h:39