File: cbbox2d.h

package info (click to toggle)
kicad 5.0.2%2Bdfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 234,592 kB
  • sloc: cpp: 505,330; ansic: 57,038; python: 4,886; sh: 879; awk: 294; makefile: 253; xml: 103; perl: 5
file content (215 lines) | stat: -rw-r--r-- 5,934 bytes parent folder | download | duplicates (2)
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
 * Copyright (C) 2015-2016 Mario Luzeiro <mrluzeiro@ua.pt>
 * Copyright (C) 1992-2016 KiCad Developers, see AUTHORS.txt for contributors.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * 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 for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, you may find one here:
 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 * or you may search the http://www.gnu.org website for the version 2 license,
 * or you may write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 */

 /**
 * @file cbbox2d.h
 * @brief 2D Bounding Box class definition
 */

#ifndef _CBBOX2D_H_
#define _CBBOX2D_H_

#include "../ray.h"


/**
 * Class CBBOX
 * manages a bounding box defined by two SFVEC2F min max points.
 */
struct CBBOX2D
{

public:

    /**
     * Constructor CBBOX2D
     * Create with default values a bounding box (not inizialized)
     */
    CBBOX2D();

    /**
     * Constructor CBBOX2D
     * Initialize a bounding box with a given point
     * @param aPbInit a point for the bounding box initialization
     */
    explicit CBBOX2D( const SFVEC2F &aPbInit );

    /**
     * Constructor CBBOX2D
     * Initialize a bounding box with a minimon and a maximun point
     * @param aPbMin the minimun point to initialize the bounding box
     * @param aPbMax the maximun point to initialize the bounding box
     */
    CBBOX2D( const SFVEC2F &aPbMin, const SFVEC2F &aPbMax );

    ~CBBOX2D();


    /**
     * Function Set
     * Set bounding box with new parameters
     * @param aPbMin the minimun point to initialize the bounding box
     * @param aPbMax the maximun point to initialize the bounding box
     */
    void Set( const SFVEC2F &aPbMin, const SFVEC2F &aPbMax );

    /**
     * Function Set
     * Set bounding box based on another bounding box
     * @param CBBOX2D a bounding box to initialize this one
     */
    void Set( const CBBOX2D &aBBox );

    /**
     * Function Union
     * recalculate the bounding box adding a point
     * @param aPoint the point to be bounded
     */
    void Union( const SFVEC2F &aPoint );

    /**
     * Function Union
     * recalculate the bounding box adding other bounding box
     * @param aBBox the bounding box to be bounded
     */
    void Union( const CBBOX2D &aBBox );

    /**
     * Function Scale
     * scales a bounding box by its center
     * @param aScale scale factor to apply
     */
    void Scale( float aScale );

    /**
     * Function ScaleNextUp
     * scales a bounding box to the next float representation making it larger
     */
    void ScaleNextUp();

    /**
     * Function ScaleNextDown
     * scales a bounding box to the next float representation making it smaller
     */
    void ScaleNextDown();

    /**
     * Function Intersects
     * test if a bounding box intersects this box
     * @param aBBox the bounding box to check if it inversects
     */
    bool Intersects( const CBBOX2D &aBBox ) const;

    /**
     * Function Intersects
     * test if a circle intersects this box
     * @param aBBox the bounding box to check if it intersects
     */
    bool Intersects( const SFVEC2F &aCenter, float aRadiusSquared ) const;

    /**
     * Function Inside
     * check is a point is inside this bounding box
     * @param aPoint point to test
     */
    bool Inside( const SFVEC2F &aPoint ) const;

    /**
     * Function Area
     * calculate the area of a bounding box
     * @return float - area of this bounding box
     */
    float Area() const;

    /**
     * Function IsInitialized
     * check if this bounding box is already initialized
     * @return bool - return true if it was initialized, false if otherwise
     */
    bool IsInitialized() const;

    /**
     * Function Reset
     * reset the bounding box to zero and de-initialized it
     */
    void Reset();

    /**
     * Function GetCenter
     * return the center point of the bounding box
     * @return SFVEC2F - the position of the center of this bounding box
     */
    SFVEC2F GetCenter() const;

    /**
     * Function GetExtent
     * @return SFVEC2F - max-min
     */
    SFVEC2F GetExtent() const;

    /**
     * Function Min
     * return the minimun vertex pointer
     * @return SFVEC2F - the minimun vertice position
     */
    const SFVEC2F &Min() const { return m_min; }

    /**
     * Function Max
     * return the maximum vertex pointer
     * @return SFVEC2F - the maximun vertice position
     */
    const SFVEC2F &Max() const { return m_max; }


    /**
     * Function MaxDimension
     * @return the index of the max dimention (0=x, 1=y)
     */
    unsigned int MaxDimension() const;

    /**
     * Function Perimeter
     * @return the surface are of the box
     */
    float Perimeter() const;

    /**
     * Function Intersect
     * @param aRay = ray to intersect the box
     * @param t = distance point of the ray of the intersection (if true)
     * @return true if the ray hits the box
     */
    bool Intersect( const RAY2D &aRay, float *t ) const;

    bool Intersect( const RAY2D &aRay, float *aOutHitT0, float *aOutHitT1 ) const;

    bool Intersect( const RAYSEG2D &aRaySeg ) const;

private:
    SFVEC2F m_min; ///< point of the lower position of the bounding box
    SFVEC2F m_max; ///< point of the higher position of the bounding box
};

#endif // CBBox2d_h