BoundingBox3D

Struct BoundingBox3D 

Source
pub struct BoundingBox3D {
    pub min_x: f64,
    pub min_y: f64,
    pub min_z: f64,
    pub max_x: f64,
    pub max_y: f64,
    pub max_z: f64,
}
Expand description

A 3D axis-aligned bounding box.

Represents a rectangular volume defined by minimum and maximum coordinates in three dimensions (x, y, z).

Fields§

§min_x: f64

Minimum x coordinate

§min_y: f64

Minimum y coordinate

§min_z: f64

Minimum z coordinate (altitude/elevation)

§max_x: f64

Maximum x coordinate

§max_y: f64

Maximum y coordinate

§max_z: f64

Maximum z coordinate (altitude/elevation)

Implementations§

Source§

impl BoundingBox3D

Source

pub fn new( min_x: f64, min_y: f64, min_z: f64, max_x: f64, max_y: f64, max_z: f64, ) -> BoundingBox3D

Create a new 3D bounding box from minimum and maximum coordinates.

§Arguments
  • min_x - Minimum x coordinate
  • min_y - Minimum y coordinate
  • min_z - Minimum z coordinate (altitude/elevation)
  • max_x - Maximum x coordinate
  • max_y - Maximum y coordinate
  • max_z - Maximum z coordinate (altitude/elevation)
§Examples
use spatio_types::bbox::BoundingBox3D;

let bbox = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 100.0);
Examples found in repository?
examples/3d_spatial_tracking.rs (lines 137-140)
9fn main() -> Result<(), Box<dyn Error>> {
10    println!("=== 3D Spatial Tracking with Spatio ===\n");
11
12    // Create an in-memory database
13    let mut db = Spatio::memory()?;
14
15    // === Example 1: Drone Fleet Tracking ===
16    println!("1. Drone Fleet Tracking");
17    println!("   Tracking multiple drones at different altitudes\n");
18
19    // Insert drones at various positions and altitudes
20    let drones = vec![
21        (
22            "drone-001",
23            -74.0060,
24            40.7128,
25            50.0,
26            "Delivery drone - Package A",
27        ),
28        (
29            "drone-002",
30            -74.0070,
31            40.7138,
32            75.0,
33            "Delivery drone - Package B",
34        ),
35        (
36            "drone-003",
37            -74.0050,
38            40.7118,
39            100.0,
40            "Survey drone - Area mapping",
41        ),
42        (
43            "drone-004",
44            -74.0080,
45            40.7148,
46            125.0,
47            "Inspection drone - Building check",
48        ),
49        (
50            "drone-005",
51            -74.0065,
52            40.7133,
53            150.0,
54            "Emergency response drone",
55        ),
56    ];
57
58    for (id, lon, lat, alt, description) in &drones {
59        let position = Point3d::new(*lon, *lat, *alt);
60        db.insert_point_3d("drones", &position, description.as_bytes(), None)?;
61        println!("   ✓ Registered {}: altitude {}m", id, alt);
62    }
63    println!();
64
65    // === Example 2: Spherical 3D Query ===
66    println!("2. Spherical 3D Query");
67    println!("   Finding drones within 3D radius\n");
68
69    let control_center = Point3d::new(-74.0065, 40.7133, 100.0);
70    let search_radius = 200.0; // 200 meters in 3D space
71
72    let nearby_drones = db.query_within_sphere_3d("drones", &control_center, search_radius, 10)?;
73
74    println!(
75        "   Control center: ({:.4}, {:.4}, {}m)",
76        control_center.x(),
77        control_center.y(),
78        control_center.z()
79    );
80    println!("   Search radius: {}m (3D)\n", search_radius);
81    println!("   Found {} drones within range:", nearby_drones.len());
82
83    for (point, data, distance) in &nearby_drones {
84        let description = String::from_utf8_lossy(data);
85        println!(
86            "   - {} at ({:.4}, {:.4}, {}m) - distance: {:.1}m",
87            description,
88            point.x(),
89            point.y(),
90            point.z(),
91            distance
92        );
93    }
94    println!();
95
96    // === Example 3: Cylindrical Query (Altitude Range) ===
97    println!("3. Cylindrical Query");
98    println!("   Finding drones in specific altitude corridor\n");
99
100    let airspace_center = Point3d::new(-74.0065, 40.7133, 0.0);
101    let min_altitude = 60.0;
102    let max_altitude = 120.0;
103    let horizontal_radius = 5000.0; // 5km horizontal
104
105    let corridor_drones = db.query_within_cylinder_3d(
106        "drones",
107        &airspace_center,
108        min_altitude,
109        max_altitude,
110        horizontal_radius,
111        10,
112    )?;
113
114    println!(
115        "   Altitude corridor: {}m - {}m",
116        min_altitude, max_altitude
117    );
118    println!("   Horizontal radius: {}m\n", horizontal_radius);
119    println!("   Found {} drones in corridor:", corridor_drones.len());
120
121    for (point, data, h_dist) in &corridor_drones {
122        let description = String::from_utf8_lossy(data);
123        println!(
124            "   - {} at altitude {}m (horizontal: {:.1}m)",
125            description,
126            point.z(),
127            h_dist
128        );
129    }
130    println!();
131
132    // === Example 4: 3D Bounding Box Query ===
133    println!("4. 3D Bounding Box Query");
134    println!("   Searching within a 3D volume\n");
135
136    // Define a 3D box covering a specific area and altitude range
137    let bbox = BoundingBox3D::new(
138        -74.0080, 40.7120, 40.0, // min x, y, z
139        -74.0050, 40.7150, 110.0, // max x, y, z
140    );
141
142    let boxed_drones = db.query_within_bbox_3d("drones", &bbox, 100)?;
143
144    println!("   Bounding box:");
145    println!("   - X: {:.4} to {:.4}", bbox.min_x, bbox.max_x);
146    println!("   - Y: {:.4} to {:.4}", bbox.min_y, bbox.max_y);
147    println!("   - Z: {}m to {}m\n", bbox.min_z, bbox.max_z);
148    println!("   Found {} drones in volume:", boxed_drones.len());
149
150    for (point, data) in &boxed_drones {
151        let description = String::from_utf8_lossy(data);
152        println!(
153            "   - {} at ({:.4}, {:.4}, {}m)",
154            description,
155            point.x(),
156            point.y(),
157            point.z()
158        );
159    }
160    println!();
161
162    // === Example 5: K-Nearest Neighbors in 3D ===
163    println!("5. K-Nearest Neighbors (3D)");
164    println!("   Finding closest drones to emergency location\n");
165
166    let emergency_location = Point3d::new(-74.0062, 40.7130, 80.0);
167    let k = 3;
168
169    let nearest = db.knn_3d("drones", &emergency_location, k)?;
170
171    println!(
172        "   Emergency at: ({:.4}, {:.4}, {}m)",
173        emergency_location.x(),
174        emergency_location.y(),
175        emergency_location.z()
176    );
177    println!("   Finding {} nearest drones:\n", k);
178
179    for (i, (point, data, distance)) in nearest.iter().enumerate() {
180        let description = String::from_utf8_lossy(data);
181        println!("   {}. {} - {:.1}m away", i + 1, description, distance);
182        println!(
183            "      Position: ({:.4}, {:.4}, {}m)",
184            point.x(),
185            point.y(),
186            point.z()
187        );
188    }
189    println!();
190
191    // === Example 6: Aircraft Tracking ===
192    println!("6. Aircraft Tracking");
193    println!("   Managing commercial flights at cruising altitude\n");
194
195    let flights = vec![
196        ("AA123", -74.0100, 40.7200, 10000.0, "NYC to BOS"),
197        ("UA456", -74.0200, 40.7300, 10500.0, "NYC to LAX"),
198        ("DL789", -74.0150, 40.7250, 9800.0, "NYC to MIA"),
199        ("SW321", -74.0050, 40.7150, 11000.0, "NYC to CHI"),
200    ];
201
202    for (flight, lon, lat, alt, route) in &flights {
203        let position = Point3d::new(*lon, *lat, *alt);
204        let info = format!("{} - {}", flight, route);
205        db.insert_point_3d("aircraft", &position, info.as_bytes(), None)?;
206        println!("   ✓ Tracking {}: {}m altitude", flight, alt);
207    }
208    println!();
209
210    // Query aircraft in specific flight level
211    let fl_center = Point3d::new(-74.0150, 40.7250, 0.0);
212    let fl_min = 9500.0; // Flight level 310 (approx)
213    let fl_max = 10500.0; // Flight level 345 (approx)
214    let radar_range = 50000.0; // 50km
215
216    let tracked_flights =
217        db.query_within_cylinder_3d("aircraft", &fl_center, fl_min, fl_max, radar_range, 20)?;
218
219    println!("   Air traffic in flight levels FL310-FL345:");
220    println!("   Radar range: {}km\n", radar_range / 1000.0);
221
222    for (point, data, h_dist) in &tracked_flights {
223        let info = String::from_utf8_lossy(data);
224        println!(
225            "   - {} at FL{:.0} ({}km away)",
226            info,
227            point.z() / 30.48 / 100.0,
228            h_dist / 1000.0
229        );
230    }
231    println!();
232
233    // === Example 7: 3D Distance Calculations ===
234    println!("7. 3D Distance Calculations");
235    println!("   Computing distances between 3D points\n");
236
237    let point_a = Point3d::new(-74.0060, 40.7128, 100.0);
238    let point_b = Point3d::new(-74.0070, 40.7138, 200.0);
239
240    let dist_3d = db.distance_between_3d(&point_a, &point_b)?;
241    let horizontal_dist = point_a.haversine_2d(&point_b);
242    let altitude_diff = point_a.altitude_difference(&point_b);
243
244    println!(
245        "   Point A: ({:.4}, {:.4}, {}m)",
246        point_a.x(),
247        point_a.y(),
248        point_a.z()
249    );
250    println!(
251        "   Point B: ({:.4}, {:.4}, {}m)",
252        point_b.x(),
253        point_b.y(),
254        point_b.z()
255    );
256    println!();
257    println!("   3D distance:        {:.2}m", dist_3d);
258    println!("   Horizontal distance: {:.2}m", horizontal_dist);
259    println!("   Altitude difference: {:.2}m", altitude_diff);
260    println!();
261
262    // === Example 8: Multi-Floor Building Navigation ===
263    println!("8. Multi-Floor Building Navigation");
264    println!("   Tracking sensors in a multi-story building\n");
265
266    // Simulate a 10-floor building with sensors on each floor
267    // Each floor is ~3 meters tall
268    for floor in 0..10 {
269        let altitude = floor as f64 * 3.0;
270        let _sensor_id = format!("sensor-floor-{:02}", floor);
271        let position = Point3d::new(-74.0060, 40.7128, altitude);
272        let info = format!("Temperature sensor - Floor {}", floor);
273        db.insert_point_3d("building-sensors", &position, info.as_bytes(), None)?;
274    }
275
276    // Query sensors on floors 3-7
277    let building_location = Point3d::new(-74.0060, 40.7128, 0.0);
278    let floor_3_altitude = 3.0 * 3.0;
279    let floor_7_altitude = 7.0 * 3.0;
280
281    let mid_floor_sensors = db.query_within_cylinder_3d(
282        "building-sensors",
283        &building_location,
284        floor_3_altitude,
285        floor_7_altitude,
286        10.0, // 10m horizontal tolerance (same building)
287        20,
288    )?;
289
290    println!("   Building sensors on floors 3-7:");
291    for (point, data, _) in &mid_floor_sensors {
292        let info = String::from_utf8_lossy(data);
293        let floor = (point.z() / 3.0).round() as i32;
294        println!("   - Floor {}: {}", floor, info);
295    }
296    println!();
297
298    // === Summary ===
299    println!("=== Summary ===");
300    println!("Demonstrated 3D spatial capabilities:");
301    println!("✓ 3D point insertion with altitude");
302    println!("✓ Spherical queries (3D radius)");
303    println!("✓ Cylindrical queries (altitude corridors)");
304    println!("✓ 3D bounding box queries");
305    println!("✓ K-nearest neighbors in 3D space");
306    println!("✓ 3D distance calculations");
307    println!("✓ Multi-altitude tracking (drones, aircraft, buildings)");
308
309    Ok(())
310}
More examples
Hide additional examples
examples/bounding_boxes.rs (lines 133-136)
10fn main() -> Result<(), Box<dyn Error>> {
11    println!("=== Spatio - Bounding Box Examples ===\n");
12
13    // Create an in-memory database
14    let mut db = Spatio::memory()?;
15    println!("✓ Created in-memory database\n");
16
17    // ========================================
18    // 1. Basic 2D Bounding Box Operations
19    // ========================================
20    println!("1. Basic 2D Bounding Box");
21    println!("-------------------------");
22
23    // Create a bounding box for Manhattan
24    let manhattan = BoundingBox2D::new(
25        -74.0479, 40.6829, // Southwest corner (Battery Park)
26        -73.9067, 40.8820, // Northeast corner (Inwood)
27    );
28
29    println!("   Manhattan bounding box:");
30    println!(
31        "     Min: ({:.4}, {:.4})",
32        manhattan.min_x(),
33        manhattan.min_y()
34    );
35    println!(
36        "     Max: ({:.4}, {:.4})",
37        manhattan.max_x(),
38        manhattan.max_y()
39    );
40    println!(
41        "     Center: ({:.4}, {:.4})",
42        manhattan.center().x(),
43        manhattan.center().y()
44    );
45    println!(
46        "     Width: {:.4}°, Height: {:.4}°",
47        manhattan.width(),
48        manhattan.height()
49    );
50
51    // Check if points are within Manhattan
52    let times_square = Point::new(-73.9855, 40.7580);
53    let brooklyn_bridge = Point::new(-73.9969, 40.7061);
54    let statue_of_liberty = Point::new(-74.0445, 40.6892);
55    let jfk_airport = Point::new(-73.7781, 40.6413);
56
57    println!("\n   Point containment checks:");
58    println!(
59        "     Times Square: {}",
60        manhattan.contains_point(&times_square)
61    );
62    println!(
63        "     Brooklyn Bridge: {}",
64        manhattan.contains_point(&brooklyn_bridge)
65    );
66    println!(
67        "     Statue of Liberty: {}",
68        manhattan.contains_point(&statue_of_liberty)
69    );
70    println!(
71        "     JFK Airport: {}",
72        manhattan.contains_point(&jfk_airport)
73    );
74
75    // ========================================
76    // 2. Bounding Box Intersection
77    // ========================================
78    println!("\n2. Bounding Box Intersection");
79    println!("-----------------------------");
80
81    // Create bounding boxes for different NYC boroughs
82    let manhattan_bbox = BoundingBox2D::new(-74.0479, 40.6829, -73.9067, 40.8820);
83    let brooklyn_bbox = BoundingBox2D::new(-74.0421, 40.5707, -73.8333, 40.7395);
84    let queens_bbox = BoundingBox2D::new(-73.9626, 40.5431, -73.7004, 40.8007);
85
86    println!(
87        "   Manhattan ∩ Brooklyn: {}",
88        manhattan_bbox.intersects(&brooklyn_bbox)
89    );
90    println!(
91        "   Manhattan ∩ Queens: {}",
92        manhattan_bbox.intersects(&queens_bbox)
93    );
94    println!(
95        "   Brooklyn ∩ Queens: {}",
96        brooklyn_bbox.intersects(&queens_bbox)
97    );
98
99    // ========================================
100    // 3. Expanding Bounding Boxes
101    // ========================================
102    println!("\n3. Expanding Bounding Boxes");
103    println!("----------------------------");
104
105    let central_park = BoundingBox2D::new(-73.9812, 40.7644, -73.9492, 40.8003);
106    println!("   Central Park original:");
107    println!(
108        "     Width: {:.4}°, Height: {:.4}°",
109        central_park.width(),
110        central_park.height()
111    );
112
113    // Expand by 0.01 degrees (~1 km)
114    let expanded = central_park.expand(0.01);
115    println!("\n   Expanded by 0.01°:");
116    println!(
117        "     Width: {:.4}°, Height: {:.4}°",
118        expanded.width(),
119        expanded.height()
120    );
121    println!(
122        "     Growth: {:.4}° in each direction",
123        (expanded.width() - central_park.width()) / 2.0
124    );
125
126    // ========================================
127    // 4. 3D Bounding Boxes
128    // ========================================
129    println!("\n4. 3D Bounding Boxes");
130    println!("--------------------");
131
132    // Create a 3D bounding box for a tall building's footprint with height
133    let one_world_trade = BoundingBox3D::new(
134        -74.0134, 40.7127, 0.0, // Ground level southwest
135        -74.0118, 40.7143, 541.0, // Top level northeast (541m height)
136    );
137
138    println!("   One World Trade Center:");
139    println!(
140        "     Footprint: {:.4}° × {:.4}°",
141        one_world_trade.width(),
142        one_world_trade.height()
143    );
144    println!("     Height: {:.1} meters", one_world_trade.depth());
145    println!(
146        "     Volume: {:.6} cubic degrees×meters",
147        one_world_trade.volume()
148    );
149
150    let (cx, cy, cz) = one_world_trade.center();
151    println!("     Center: ({:.4}, {:.4}, {:.1}m)", cx, cy, cz);
152
153    // Check if points at different altitudes are within the building
154    println!("\n   Altitude containment checks:");
155    println!(
156        "     Ground level (0m): {}",
157        one_world_trade.contains_point(-74.0126, 40.7135, 0.0)
158    );
159    println!(
160        "     Mid-level (270m): {}",
161        one_world_trade.contains_point(-74.0126, 40.7135, 270.0)
162    );
163    println!(
164        "     Top (540m): {}",
165        one_world_trade.contains_point(-74.0126, 40.7135, 540.0)
166    );
167    println!(
168        "     Above (600m): {}",
169        one_world_trade.contains_point(-74.0126, 40.7135, 600.0)
170    );
171
172    // ========================================
173    // 5. 3D to 2D Projection
174    // ========================================
175    println!("\n5. 3D to 2D Projection");
176    println!("----------------------");
177
178    let building_3d = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 200.0);
179    let building_2d = building_3d.to_2d();
180
181    println!("   3D Bounding Box:");
182    println!(
183        "     Dimensions: {:.4}° × {:.4}° × {:.1}m",
184        building_3d.width(),
185        building_3d.height(),
186        building_3d.depth()
187    );
188
189    println!("\n   Projected to 2D:");
190    println!(
191        "     Dimensions: {:.4}° × {:.4}°",
192        building_2d.width(),
193        building_2d.height()
194    );
195
196    // ========================================
197    // 6. Temporal Bounding Boxes
198    // ========================================
199    println!("\n6. Temporal Bounding Boxes");
200    println!("--------------------------");
201
202    // Track how a delivery zone changes over time
203    let morning_zone = BoundingBox2D::new(-74.01, 40.71, -73.99, 40.73);
204    let afternoon_zone = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.74);
205
206    let morning_time = SystemTime::now();
207    let afternoon_time = SystemTime::now();
208
209    let temporal_morning = TemporalBoundingBox2D::new(morning_zone.clone(), morning_time);
210    let temporal_afternoon = TemporalBoundingBox2D::new(afternoon_zone.clone(), afternoon_time);
211
212    println!("   Morning delivery zone:");
213    println!(
214        "     Area: {:.4}° × {:.4}°",
215        temporal_morning.bbox().width(),
216        temporal_morning.bbox().height()
217    );
218
219    println!("\n   Afternoon delivery zone:");
220    println!(
221        "     Area: {:.4}° × {:.4}°",
222        temporal_afternoon.bbox().width(),
223        temporal_afternoon.bbox().height()
224    );
225
226    println!(
227        "     Expansion: {:.4}° wider, {:.4}° taller",
228        afternoon_zone.width() - morning_zone.width(),
229        afternoon_zone.height() - morning_zone.height()
230    );
231
232    // ========================================
233    // 7. Storing Bounding Boxes in Database
234    // ========================================
235    println!("\n7. Storing Bounding Boxes");
236    println!("-------------------------");
237
238    // Serialize and store bounding boxes
239    let bbox_json = serde_json::to_vec(&manhattan)?;
240    db.insert("zones:manhattan", bbox_json, None)?;
241
242    let bbox3d_json = serde_json::to_vec(&one_world_trade)?;
243    db.insert("buildings:wtc", bbox3d_json, None)?;
244
245    println!("   ✓ Stored Manhattan bounding box");
246    println!("   ✓ Stored One World Trade Center 3D box");
247
248    // Retrieve and deserialize
249    if let Some(data) = db.get("zones:manhattan")? {
250        let retrieved: BoundingBox2D = serde_json::from_slice(&data)?;
251        println!("\n   Retrieved Manhattan box:");
252        println!(
253            "     Center: ({:.4}, {:.4})",
254            retrieved.center().x(),
255            retrieved.center().y()
256        );
257    }
258
259    // ========================================
260    // 8. Practical Use Cases
261    // ========================================
262    println!("\n8. Practical Use Cases");
263    println!("----------------------");
264
265    // Geofencing
266    let delivery_area = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.75);
267    let current_location = Point::new(-74.00, 40.72);
268
269    if delivery_area.contains_point(&current_location) {
270        println!("   ✓ Delivery driver is within service area");
271    } else {
272        println!("   ✗ Delivery driver is outside service area");
273    }
274
275    // Airspace management
276    let airspace = BoundingBox3D::new(
277        -74.1, 40.6, 0.0, // Ground level
278        -73.8, 40.9, 3000.0, // 3000m ceiling
279    );
280    let drone_altitude = 150.0; // meters
281    let drone_location = (-74.0, 40.75, drone_altitude);
282
283    if airspace.contains_point(drone_location.0, drone_location.1, drone_location.2) {
284        println!("   ✓ Drone is within authorized airspace");
285    }
286
287    // Region overlap detection
288    let zone_a = BoundingBox2D::new(-74.05, 40.70, -74.00, 40.75);
289    let zone_b = BoundingBox2D::new(-74.02, 40.72, -73.97, 40.77);
290
291    if zone_a.intersects(&zone_b) {
292        println!("   ⚠ Service zones A and B overlap - coordination needed");
293    }
294
295    println!("\n=== Bounding Box Examples Complete! ===");
296    println!("\nKey Features Demonstrated:");
297    println!("  • Create and manipulate 2D/3D bounding boxes");
298    println!("  • Check point containment");
299    println!("  • Detect box intersections");
300    println!("  • Expand regions");
301    println!("  • Project 3D to 2D");
302    println!("  • Track temporal changes");
303    println!("  • Serialize and store in database");
304    println!("  • Geofencing and airspace management");
305
306    Ok(())
307}
Source

pub fn center(&self) -> (f64, f64, f64)

Get the center point of the bounding box.

Examples found in repository?
examples/bounding_boxes.rs (line 150)
10fn main() -> Result<(), Box<dyn Error>> {
11    println!("=== Spatio - Bounding Box Examples ===\n");
12
13    // Create an in-memory database
14    let mut db = Spatio::memory()?;
15    println!("✓ Created in-memory database\n");
16
17    // ========================================
18    // 1. Basic 2D Bounding Box Operations
19    // ========================================
20    println!("1. Basic 2D Bounding Box");
21    println!("-------------------------");
22
23    // Create a bounding box for Manhattan
24    let manhattan = BoundingBox2D::new(
25        -74.0479, 40.6829, // Southwest corner (Battery Park)
26        -73.9067, 40.8820, // Northeast corner (Inwood)
27    );
28
29    println!("   Manhattan bounding box:");
30    println!(
31        "     Min: ({:.4}, {:.4})",
32        manhattan.min_x(),
33        manhattan.min_y()
34    );
35    println!(
36        "     Max: ({:.4}, {:.4})",
37        manhattan.max_x(),
38        manhattan.max_y()
39    );
40    println!(
41        "     Center: ({:.4}, {:.4})",
42        manhattan.center().x(),
43        manhattan.center().y()
44    );
45    println!(
46        "     Width: {:.4}°, Height: {:.4}°",
47        manhattan.width(),
48        manhattan.height()
49    );
50
51    // Check if points are within Manhattan
52    let times_square = Point::new(-73.9855, 40.7580);
53    let brooklyn_bridge = Point::new(-73.9969, 40.7061);
54    let statue_of_liberty = Point::new(-74.0445, 40.6892);
55    let jfk_airport = Point::new(-73.7781, 40.6413);
56
57    println!("\n   Point containment checks:");
58    println!(
59        "     Times Square: {}",
60        manhattan.contains_point(&times_square)
61    );
62    println!(
63        "     Brooklyn Bridge: {}",
64        manhattan.contains_point(&brooklyn_bridge)
65    );
66    println!(
67        "     Statue of Liberty: {}",
68        manhattan.contains_point(&statue_of_liberty)
69    );
70    println!(
71        "     JFK Airport: {}",
72        manhattan.contains_point(&jfk_airport)
73    );
74
75    // ========================================
76    // 2. Bounding Box Intersection
77    // ========================================
78    println!("\n2. Bounding Box Intersection");
79    println!("-----------------------------");
80
81    // Create bounding boxes for different NYC boroughs
82    let manhattan_bbox = BoundingBox2D::new(-74.0479, 40.6829, -73.9067, 40.8820);
83    let brooklyn_bbox = BoundingBox2D::new(-74.0421, 40.5707, -73.8333, 40.7395);
84    let queens_bbox = BoundingBox2D::new(-73.9626, 40.5431, -73.7004, 40.8007);
85
86    println!(
87        "   Manhattan ∩ Brooklyn: {}",
88        manhattan_bbox.intersects(&brooklyn_bbox)
89    );
90    println!(
91        "   Manhattan ∩ Queens: {}",
92        manhattan_bbox.intersects(&queens_bbox)
93    );
94    println!(
95        "   Brooklyn ∩ Queens: {}",
96        brooklyn_bbox.intersects(&queens_bbox)
97    );
98
99    // ========================================
100    // 3. Expanding Bounding Boxes
101    // ========================================
102    println!("\n3. Expanding Bounding Boxes");
103    println!("----------------------------");
104
105    let central_park = BoundingBox2D::new(-73.9812, 40.7644, -73.9492, 40.8003);
106    println!("   Central Park original:");
107    println!(
108        "     Width: {:.4}°, Height: {:.4}°",
109        central_park.width(),
110        central_park.height()
111    );
112
113    // Expand by 0.01 degrees (~1 km)
114    let expanded = central_park.expand(0.01);
115    println!("\n   Expanded by 0.01°:");
116    println!(
117        "     Width: {:.4}°, Height: {:.4}°",
118        expanded.width(),
119        expanded.height()
120    );
121    println!(
122        "     Growth: {:.4}° in each direction",
123        (expanded.width() - central_park.width()) / 2.0
124    );
125
126    // ========================================
127    // 4. 3D Bounding Boxes
128    // ========================================
129    println!("\n4. 3D Bounding Boxes");
130    println!("--------------------");
131
132    // Create a 3D bounding box for a tall building's footprint with height
133    let one_world_trade = BoundingBox3D::new(
134        -74.0134, 40.7127, 0.0, // Ground level southwest
135        -74.0118, 40.7143, 541.0, // Top level northeast (541m height)
136    );
137
138    println!("   One World Trade Center:");
139    println!(
140        "     Footprint: {:.4}° × {:.4}°",
141        one_world_trade.width(),
142        one_world_trade.height()
143    );
144    println!("     Height: {:.1} meters", one_world_trade.depth());
145    println!(
146        "     Volume: {:.6} cubic degrees×meters",
147        one_world_trade.volume()
148    );
149
150    let (cx, cy, cz) = one_world_trade.center();
151    println!("     Center: ({:.4}, {:.4}, {:.1}m)", cx, cy, cz);
152
153    // Check if points at different altitudes are within the building
154    println!("\n   Altitude containment checks:");
155    println!(
156        "     Ground level (0m): {}",
157        one_world_trade.contains_point(-74.0126, 40.7135, 0.0)
158    );
159    println!(
160        "     Mid-level (270m): {}",
161        one_world_trade.contains_point(-74.0126, 40.7135, 270.0)
162    );
163    println!(
164        "     Top (540m): {}",
165        one_world_trade.contains_point(-74.0126, 40.7135, 540.0)
166    );
167    println!(
168        "     Above (600m): {}",
169        one_world_trade.contains_point(-74.0126, 40.7135, 600.0)
170    );
171
172    // ========================================
173    // 5. 3D to 2D Projection
174    // ========================================
175    println!("\n5. 3D to 2D Projection");
176    println!("----------------------");
177
178    let building_3d = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 200.0);
179    let building_2d = building_3d.to_2d();
180
181    println!("   3D Bounding Box:");
182    println!(
183        "     Dimensions: {:.4}° × {:.4}° × {:.1}m",
184        building_3d.width(),
185        building_3d.height(),
186        building_3d.depth()
187    );
188
189    println!("\n   Projected to 2D:");
190    println!(
191        "     Dimensions: {:.4}° × {:.4}°",
192        building_2d.width(),
193        building_2d.height()
194    );
195
196    // ========================================
197    // 6. Temporal Bounding Boxes
198    // ========================================
199    println!("\n6. Temporal Bounding Boxes");
200    println!("--------------------------");
201
202    // Track how a delivery zone changes over time
203    let morning_zone = BoundingBox2D::new(-74.01, 40.71, -73.99, 40.73);
204    let afternoon_zone = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.74);
205
206    let morning_time = SystemTime::now();
207    let afternoon_time = SystemTime::now();
208
209    let temporal_morning = TemporalBoundingBox2D::new(morning_zone.clone(), morning_time);
210    let temporal_afternoon = TemporalBoundingBox2D::new(afternoon_zone.clone(), afternoon_time);
211
212    println!("   Morning delivery zone:");
213    println!(
214        "     Area: {:.4}° × {:.4}°",
215        temporal_morning.bbox().width(),
216        temporal_morning.bbox().height()
217    );
218
219    println!("\n   Afternoon delivery zone:");
220    println!(
221        "     Area: {:.4}° × {:.4}°",
222        temporal_afternoon.bbox().width(),
223        temporal_afternoon.bbox().height()
224    );
225
226    println!(
227        "     Expansion: {:.4}° wider, {:.4}° taller",
228        afternoon_zone.width() - morning_zone.width(),
229        afternoon_zone.height() - morning_zone.height()
230    );
231
232    // ========================================
233    // 7. Storing Bounding Boxes in Database
234    // ========================================
235    println!("\n7. Storing Bounding Boxes");
236    println!("-------------------------");
237
238    // Serialize and store bounding boxes
239    let bbox_json = serde_json::to_vec(&manhattan)?;
240    db.insert("zones:manhattan", bbox_json, None)?;
241
242    let bbox3d_json = serde_json::to_vec(&one_world_trade)?;
243    db.insert("buildings:wtc", bbox3d_json, None)?;
244
245    println!("   ✓ Stored Manhattan bounding box");
246    println!("   ✓ Stored One World Trade Center 3D box");
247
248    // Retrieve and deserialize
249    if let Some(data) = db.get("zones:manhattan")? {
250        let retrieved: BoundingBox2D = serde_json::from_slice(&data)?;
251        println!("\n   Retrieved Manhattan box:");
252        println!(
253            "     Center: ({:.4}, {:.4})",
254            retrieved.center().x(),
255            retrieved.center().y()
256        );
257    }
258
259    // ========================================
260    // 8. Practical Use Cases
261    // ========================================
262    println!("\n8. Practical Use Cases");
263    println!("----------------------");
264
265    // Geofencing
266    let delivery_area = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.75);
267    let current_location = Point::new(-74.00, 40.72);
268
269    if delivery_area.contains_point(&current_location) {
270        println!("   ✓ Delivery driver is within service area");
271    } else {
272        println!("   ✗ Delivery driver is outside service area");
273    }
274
275    // Airspace management
276    let airspace = BoundingBox3D::new(
277        -74.1, 40.6, 0.0, // Ground level
278        -73.8, 40.9, 3000.0, // 3000m ceiling
279    );
280    let drone_altitude = 150.0; // meters
281    let drone_location = (-74.0, 40.75, drone_altitude);
282
283    if airspace.contains_point(drone_location.0, drone_location.1, drone_location.2) {
284        println!("   ✓ Drone is within authorized airspace");
285    }
286
287    // Region overlap detection
288    let zone_a = BoundingBox2D::new(-74.05, 40.70, -74.00, 40.75);
289    let zone_b = BoundingBox2D::new(-74.02, 40.72, -73.97, 40.77);
290
291    if zone_a.intersects(&zone_b) {
292        println!("   ⚠ Service zones A and B overlap - coordination needed");
293    }
294
295    println!("\n=== Bounding Box Examples Complete! ===");
296    println!("\nKey Features Demonstrated:");
297    println!("  • Create and manipulate 2D/3D bounding boxes");
298    println!("  • Check point containment");
299    println!("  • Detect box intersections");
300    println!("  • Expand regions");
301    println!("  • Project 3D to 2D");
302    println!("  • Track temporal changes");
303    println!("  • Serialize and store in database");
304    println!("  • Geofencing and airspace management");
305
306    Ok(())
307}
Source

pub fn width(&self) -> f64

Get the width (x dimension) of the bounding box.

Examples found in repository?
examples/bounding_boxes.rs (line 141)
10fn main() -> Result<(), Box<dyn Error>> {
11    println!("=== Spatio - Bounding Box Examples ===\n");
12
13    // Create an in-memory database
14    let mut db = Spatio::memory()?;
15    println!("✓ Created in-memory database\n");
16
17    // ========================================
18    // 1. Basic 2D Bounding Box Operations
19    // ========================================
20    println!("1. Basic 2D Bounding Box");
21    println!("-------------------------");
22
23    // Create a bounding box for Manhattan
24    let manhattan = BoundingBox2D::new(
25        -74.0479, 40.6829, // Southwest corner (Battery Park)
26        -73.9067, 40.8820, // Northeast corner (Inwood)
27    );
28
29    println!("   Manhattan bounding box:");
30    println!(
31        "     Min: ({:.4}, {:.4})",
32        manhattan.min_x(),
33        manhattan.min_y()
34    );
35    println!(
36        "     Max: ({:.4}, {:.4})",
37        manhattan.max_x(),
38        manhattan.max_y()
39    );
40    println!(
41        "     Center: ({:.4}, {:.4})",
42        manhattan.center().x(),
43        manhattan.center().y()
44    );
45    println!(
46        "     Width: {:.4}°, Height: {:.4}°",
47        manhattan.width(),
48        manhattan.height()
49    );
50
51    // Check if points are within Manhattan
52    let times_square = Point::new(-73.9855, 40.7580);
53    let brooklyn_bridge = Point::new(-73.9969, 40.7061);
54    let statue_of_liberty = Point::new(-74.0445, 40.6892);
55    let jfk_airport = Point::new(-73.7781, 40.6413);
56
57    println!("\n   Point containment checks:");
58    println!(
59        "     Times Square: {}",
60        manhattan.contains_point(&times_square)
61    );
62    println!(
63        "     Brooklyn Bridge: {}",
64        manhattan.contains_point(&brooklyn_bridge)
65    );
66    println!(
67        "     Statue of Liberty: {}",
68        manhattan.contains_point(&statue_of_liberty)
69    );
70    println!(
71        "     JFK Airport: {}",
72        manhattan.contains_point(&jfk_airport)
73    );
74
75    // ========================================
76    // 2. Bounding Box Intersection
77    // ========================================
78    println!("\n2. Bounding Box Intersection");
79    println!("-----------------------------");
80
81    // Create bounding boxes for different NYC boroughs
82    let manhattan_bbox = BoundingBox2D::new(-74.0479, 40.6829, -73.9067, 40.8820);
83    let brooklyn_bbox = BoundingBox2D::new(-74.0421, 40.5707, -73.8333, 40.7395);
84    let queens_bbox = BoundingBox2D::new(-73.9626, 40.5431, -73.7004, 40.8007);
85
86    println!(
87        "   Manhattan ∩ Brooklyn: {}",
88        manhattan_bbox.intersects(&brooklyn_bbox)
89    );
90    println!(
91        "   Manhattan ∩ Queens: {}",
92        manhattan_bbox.intersects(&queens_bbox)
93    );
94    println!(
95        "   Brooklyn ∩ Queens: {}",
96        brooklyn_bbox.intersects(&queens_bbox)
97    );
98
99    // ========================================
100    // 3. Expanding Bounding Boxes
101    // ========================================
102    println!("\n3. Expanding Bounding Boxes");
103    println!("----------------------------");
104
105    let central_park = BoundingBox2D::new(-73.9812, 40.7644, -73.9492, 40.8003);
106    println!("   Central Park original:");
107    println!(
108        "     Width: {:.4}°, Height: {:.4}°",
109        central_park.width(),
110        central_park.height()
111    );
112
113    // Expand by 0.01 degrees (~1 km)
114    let expanded = central_park.expand(0.01);
115    println!("\n   Expanded by 0.01°:");
116    println!(
117        "     Width: {:.4}°, Height: {:.4}°",
118        expanded.width(),
119        expanded.height()
120    );
121    println!(
122        "     Growth: {:.4}° in each direction",
123        (expanded.width() - central_park.width()) / 2.0
124    );
125
126    // ========================================
127    // 4. 3D Bounding Boxes
128    // ========================================
129    println!("\n4. 3D Bounding Boxes");
130    println!("--------------------");
131
132    // Create a 3D bounding box for a tall building's footprint with height
133    let one_world_trade = BoundingBox3D::new(
134        -74.0134, 40.7127, 0.0, // Ground level southwest
135        -74.0118, 40.7143, 541.0, // Top level northeast (541m height)
136    );
137
138    println!("   One World Trade Center:");
139    println!(
140        "     Footprint: {:.4}° × {:.4}°",
141        one_world_trade.width(),
142        one_world_trade.height()
143    );
144    println!("     Height: {:.1} meters", one_world_trade.depth());
145    println!(
146        "     Volume: {:.6} cubic degrees×meters",
147        one_world_trade.volume()
148    );
149
150    let (cx, cy, cz) = one_world_trade.center();
151    println!("     Center: ({:.4}, {:.4}, {:.1}m)", cx, cy, cz);
152
153    // Check if points at different altitudes are within the building
154    println!("\n   Altitude containment checks:");
155    println!(
156        "     Ground level (0m): {}",
157        one_world_trade.contains_point(-74.0126, 40.7135, 0.0)
158    );
159    println!(
160        "     Mid-level (270m): {}",
161        one_world_trade.contains_point(-74.0126, 40.7135, 270.0)
162    );
163    println!(
164        "     Top (540m): {}",
165        one_world_trade.contains_point(-74.0126, 40.7135, 540.0)
166    );
167    println!(
168        "     Above (600m): {}",
169        one_world_trade.contains_point(-74.0126, 40.7135, 600.0)
170    );
171
172    // ========================================
173    // 5. 3D to 2D Projection
174    // ========================================
175    println!("\n5. 3D to 2D Projection");
176    println!("----------------------");
177
178    let building_3d = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 200.0);
179    let building_2d = building_3d.to_2d();
180
181    println!("   3D Bounding Box:");
182    println!(
183        "     Dimensions: {:.4}° × {:.4}° × {:.1}m",
184        building_3d.width(),
185        building_3d.height(),
186        building_3d.depth()
187    );
188
189    println!("\n   Projected to 2D:");
190    println!(
191        "     Dimensions: {:.4}° × {:.4}°",
192        building_2d.width(),
193        building_2d.height()
194    );
195
196    // ========================================
197    // 6. Temporal Bounding Boxes
198    // ========================================
199    println!("\n6. Temporal Bounding Boxes");
200    println!("--------------------------");
201
202    // Track how a delivery zone changes over time
203    let morning_zone = BoundingBox2D::new(-74.01, 40.71, -73.99, 40.73);
204    let afternoon_zone = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.74);
205
206    let morning_time = SystemTime::now();
207    let afternoon_time = SystemTime::now();
208
209    let temporal_morning = TemporalBoundingBox2D::new(morning_zone.clone(), morning_time);
210    let temporal_afternoon = TemporalBoundingBox2D::new(afternoon_zone.clone(), afternoon_time);
211
212    println!("   Morning delivery zone:");
213    println!(
214        "     Area: {:.4}° × {:.4}°",
215        temporal_morning.bbox().width(),
216        temporal_morning.bbox().height()
217    );
218
219    println!("\n   Afternoon delivery zone:");
220    println!(
221        "     Area: {:.4}° × {:.4}°",
222        temporal_afternoon.bbox().width(),
223        temporal_afternoon.bbox().height()
224    );
225
226    println!(
227        "     Expansion: {:.4}° wider, {:.4}° taller",
228        afternoon_zone.width() - morning_zone.width(),
229        afternoon_zone.height() - morning_zone.height()
230    );
231
232    // ========================================
233    // 7. Storing Bounding Boxes in Database
234    // ========================================
235    println!("\n7. Storing Bounding Boxes");
236    println!("-------------------------");
237
238    // Serialize and store bounding boxes
239    let bbox_json = serde_json::to_vec(&manhattan)?;
240    db.insert("zones:manhattan", bbox_json, None)?;
241
242    let bbox3d_json = serde_json::to_vec(&one_world_trade)?;
243    db.insert("buildings:wtc", bbox3d_json, None)?;
244
245    println!("   ✓ Stored Manhattan bounding box");
246    println!("   ✓ Stored One World Trade Center 3D box");
247
248    // Retrieve and deserialize
249    if let Some(data) = db.get("zones:manhattan")? {
250        let retrieved: BoundingBox2D = serde_json::from_slice(&data)?;
251        println!("\n   Retrieved Manhattan box:");
252        println!(
253            "     Center: ({:.4}, {:.4})",
254            retrieved.center().x(),
255            retrieved.center().y()
256        );
257    }
258
259    // ========================================
260    // 8. Practical Use Cases
261    // ========================================
262    println!("\n8. Practical Use Cases");
263    println!("----------------------");
264
265    // Geofencing
266    let delivery_area = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.75);
267    let current_location = Point::new(-74.00, 40.72);
268
269    if delivery_area.contains_point(&current_location) {
270        println!("   ✓ Delivery driver is within service area");
271    } else {
272        println!("   ✗ Delivery driver is outside service area");
273    }
274
275    // Airspace management
276    let airspace = BoundingBox3D::new(
277        -74.1, 40.6, 0.0, // Ground level
278        -73.8, 40.9, 3000.0, // 3000m ceiling
279    );
280    let drone_altitude = 150.0; // meters
281    let drone_location = (-74.0, 40.75, drone_altitude);
282
283    if airspace.contains_point(drone_location.0, drone_location.1, drone_location.2) {
284        println!("   ✓ Drone is within authorized airspace");
285    }
286
287    // Region overlap detection
288    let zone_a = BoundingBox2D::new(-74.05, 40.70, -74.00, 40.75);
289    let zone_b = BoundingBox2D::new(-74.02, 40.72, -73.97, 40.77);
290
291    if zone_a.intersects(&zone_b) {
292        println!("   ⚠ Service zones A and B overlap - coordination needed");
293    }
294
295    println!("\n=== Bounding Box Examples Complete! ===");
296    println!("\nKey Features Demonstrated:");
297    println!("  • Create and manipulate 2D/3D bounding boxes");
298    println!("  • Check point containment");
299    println!("  • Detect box intersections");
300    println!("  • Expand regions");
301    println!("  • Project 3D to 2D");
302    println!("  • Track temporal changes");
303    println!("  • Serialize and store in database");
304    println!("  • Geofencing and airspace management");
305
306    Ok(())
307}
Source

pub fn height(&self) -> f64

Get the height (y dimension) of the bounding box.

Examples found in repository?
examples/bounding_boxes.rs (line 142)
10fn main() -> Result<(), Box<dyn Error>> {
11    println!("=== Spatio - Bounding Box Examples ===\n");
12
13    // Create an in-memory database
14    let mut db = Spatio::memory()?;
15    println!("✓ Created in-memory database\n");
16
17    // ========================================
18    // 1. Basic 2D Bounding Box Operations
19    // ========================================
20    println!("1. Basic 2D Bounding Box");
21    println!("-------------------------");
22
23    // Create a bounding box for Manhattan
24    let manhattan = BoundingBox2D::new(
25        -74.0479, 40.6829, // Southwest corner (Battery Park)
26        -73.9067, 40.8820, // Northeast corner (Inwood)
27    );
28
29    println!("   Manhattan bounding box:");
30    println!(
31        "     Min: ({:.4}, {:.4})",
32        manhattan.min_x(),
33        manhattan.min_y()
34    );
35    println!(
36        "     Max: ({:.4}, {:.4})",
37        manhattan.max_x(),
38        manhattan.max_y()
39    );
40    println!(
41        "     Center: ({:.4}, {:.4})",
42        manhattan.center().x(),
43        manhattan.center().y()
44    );
45    println!(
46        "     Width: {:.4}°, Height: {:.4}°",
47        manhattan.width(),
48        manhattan.height()
49    );
50
51    // Check if points are within Manhattan
52    let times_square = Point::new(-73.9855, 40.7580);
53    let brooklyn_bridge = Point::new(-73.9969, 40.7061);
54    let statue_of_liberty = Point::new(-74.0445, 40.6892);
55    let jfk_airport = Point::new(-73.7781, 40.6413);
56
57    println!("\n   Point containment checks:");
58    println!(
59        "     Times Square: {}",
60        manhattan.contains_point(&times_square)
61    );
62    println!(
63        "     Brooklyn Bridge: {}",
64        manhattan.contains_point(&brooklyn_bridge)
65    );
66    println!(
67        "     Statue of Liberty: {}",
68        manhattan.contains_point(&statue_of_liberty)
69    );
70    println!(
71        "     JFK Airport: {}",
72        manhattan.contains_point(&jfk_airport)
73    );
74
75    // ========================================
76    // 2. Bounding Box Intersection
77    // ========================================
78    println!("\n2. Bounding Box Intersection");
79    println!("-----------------------------");
80
81    // Create bounding boxes for different NYC boroughs
82    let manhattan_bbox = BoundingBox2D::new(-74.0479, 40.6829, -73.9067, 40.8820);
83    let brooklyn_bbox = BoundingBox2D::new(-74.0421, 40.5707, -73.8333, 40.7395);
84    let queens_bbox = BoundingBox2D::new(-73.9626, 40.5431, -73.7004, 40.8007);
85
86    println!(
87        "   Manhattan ∩ Brooklyn: {}",
88        manhattan_bbox.intersects(&brooklyn_bbox)
89    );
90    println!(
91        "   Manhattan ∩ Queens: {}",
92        manhattan_bbox.intersects(&queens_bbox)
93    );
94    println!(
95        "   Brooklyn ∩ Queens: {}",
96        brooklyn_bbox.intersects(&queens_bbox)
97    );
98
99    // ========================================
100    // 3. Expanding Bounding Boxes
101    // ========================================
102    println!("\n3. Expanding Bounding Boxes");
103    println!("----------------------------");
104
105    let central_park = BoundingBox2D::new(-73.9812, 40.7644, -73.9492, 40.8003);
106    println!("   Central Park original:");
107    println!(
108        "     Width: {:.4}°, Height: {:.4}°",
109        central_park.width(),
110        central_park.height()
111    );
112
113    // Expand by 0.01 degrees (~1 km)
114    let expanded = central_park.expand(0.01);
115    println!("\n   Expanded by 0.01°:");
116    println!(
117        "     Width: {:.4}°, Height: {:.4}°",
118        expanded.width(),
119        expanded.height()
120    );
121    println!(
122        "     Growth: {:.4}° in each direction",
123        (expanded.width() - central_park.width()) / 2.0
124    );
125
126    // ========================================
127    // 4. 3D Bounding Boxes
128    // ========================================
129    println!("\n4. 3D Bounding Boxes");
130    println!("--------------------");
131
132    // Create a 3D bounding box for a tall building's footprint with height
133    let one_world_trade = BoundingBox3D::new(
134        -74.0134, 40.7127, 0.0, // Ground level southwest
135        -74.0118, 40.7143, 541.0, // Top level northeast (541m height)
136    );
137
138    println!("   One World Trade Center:");
139    println!(
140        "     Footprint: {:.4}° × {:.4}°",
141        one_world_trade.width(),
142        one_world_trade.height()
143    );
144    println!("     Height: {:.1} meters", one_world_trade.depth());
145    println!(
146        "     Volume: {:.6} cubic degrees×meters",
147        one_world_trade.volume()
148    );
149
150    let (cx, cy, cz) = one_world_trade.center();
151    println!("     Center: ({:.4}, {:.4}, {:.1}m)", cx, cy, cz);
152
153    // Check if points at different altitudes are within the building
154    println!("\n   Altitude containment checks:");
155    println!(
156        "     Ground level (0m): {}",
157        one_world_trade.contains_point(-74.0126, 40.7135, 0.0)
158    );
159    println!(
160        "     Mid-level (270m): {}",
161        one_world_trade.contains_point(-74.0126, 40.7135, 270.0)
162    );
163    println!(
164        "     Top (540m): {}",
165        one_world_trade.contains_point(-74.0126, 40.7135, 540.0)
166    );
167    println!(
168        "     Above (600m): {}",
169        one_world_trade.contains_point(-74.0126, 40.7135, 600.0)
170    );
171
172    // ========================================
173    // 5. 3D to 2D Projection
174    // ========================================
175    println!("\n5. 3D to 2D Projection");
176    println!("----------------------");
177
178    let building_3d = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 200.0);
179    let building_2d = building_3d.to_2d();
180
181    println!("   3D Bounding Box:");
182    println!(
183        "     Dimensions: {:.4}° × {:.4}° × {:.1}m",
184        building_3d.width(),
185        building_3d.height(),
186        building_3d.depth()
187    );
188
189    println!("\n   Projected to 2D:");
190    println!(
191        "     Dimensions: {:.4}° × {:.4}°",
192        building_2d.width(),
193        building_2d.height()
194    );
195
196    // ========================================
197    // 6. Temporal Bounding Boxes
198    // ========================================
199    println!("\n6. Temporal Bounding Boxes");
200    println!("--------------------------");
201
202    // Track how a delivery zone changes over time
203    let morning_zone = BoundingBox2D::new(-74.01, 40.71, -73.99, 40.73);
204    let afternoon_zone = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.74);
205
206    let morning_time = SystemTime::now();
207    let afternoon_time = SystemTime::now();
208
209    let temporal_morning = TemporalBoundingBox2D::new(morning_zone.clone(), morning_time);
210    let temporal_afternoon = TemporalBoundingBox2D::new(afternoon_zone.clone(), afternoon_time);
211
212    println!("   Morning delivery zone:");
213    println!(
214        "     Area: {:.4}° × {:.4}°",
215        temporal_morning.bbox().width(),
216        temporal_morning.bbox().height()
217    );
218
219    println!("\n   Afternoon delivery zone:");
220    println!(
221        "     Area: {:.4}° × {:.4}°",
222        temporal_afternoon.bbox().width(),
223        temporal_afternoon.bbox().height()
224    );
225
226    println!(
227        "     Expansion: {:.4}° wider, {:.4}° taller",
228        afternoon_zone.width() - morning_zone.width(),
229        afternoon_zone.height() - morning_zone.height()
230    );
231
232    // ========================================
233    // 7. Storing Bounding Boxes in Database
234    // ========================================
235    println!("\n7. Storing Bounding Boxes");
236    println!("-------------------------");
237
238    // Serialize and store bounding boxes
239    let bbox_json = serde_json::to_vec(&manhattan)?;
240    db.insert("zones:manhattan", bbox_json, None)?;
241
242    let bbox3d_json = serde_json::to_vec(&one_world_trade)?;
243    db.insert("buildings:wtc", bbox3d_json, None)?;
244
245    println!("   ✓ Stored Manhattan bounding box");
246    println!("   ✓ Stored One World Trade Center 3D box");
247
248    // Retrieve and deserialize
249    if let Some(data) = db.get("zones:manhattan")? {
250        let retrieved: BoundingBox2D = serde_json::from_slice(&data)?;
251        println!("\n   Retrieved Manhattan box:");
252        println!(
253            "     Center: ({:.4}, {:.4})",
254            retrieved.center().x(),
255            retrieved.center().y()
256        );
257    }
258
259    // ========================================
260    // 8. Practical Use Cases
261    // ========================================
262    println!("\n8. Practical Use Cases");
263    println!("----------------------");
264
265    // Geofencing
266    let delivery_area = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.75);
267    let current_location = Point::new(-74.00, 40.72);
268
269    if delivery_area.contains_point(&current_location) {
270        println!("   ✓ Delivery driver is within service area");
271    } else {
272        println!("   ✗ Delivery driver is outside service area");
273    }
274
275    // Airspace management
276    let airspace = BoundingBox3D::new(
277        -74.1, 40.6, 0.0, // Ground level
278        -73.8, 40.9, 3000.0, // 3000m ceiling
279    );
280    let drone_altitude = 150.0; // meters
281    let drone_location = (-74.0, 40.75, drone_altitude);
282
283    if airspace.contains_point(drone_location.0, drone_location.1, drone_location.2) {
284        println!("   ✓ Drone is within authorized airspace");
285    }
286
287    // Region overlap detection
288    let zone_a = BoundingBox2D::new(-74.05, 40.70, -74.00, 40.75);
289    let zone_b = BoundingBox2D::new(-74.02, 40.72, -73.97, 40.77);
290
291    if zone_a.intersects(&zone_b) {
292        println!("   ⚠ Service zones A and B overlap - coordination needed");
293    }
294
295    println!("\n=== Bounding Box Examples Complete! ===");
296    println!("\nKey Features Demonstrated:");
297    println!("  • Create and manipulate 2D/3D bounding boxes");
298    println!("  • Check point containment");
299    println!("  • Detect box intersections");
300    println!("  • Expand regions");
301    println!("  • Project 3D to 2D");
302    println!("  • Track temporal changes");
303    println!("  • Serialize and store in database");
304    println!("  • Geofencing and airspace management");
305
306    Ok(())
307}
Source

pub fn depth(&self) -> f64

Get the depth (z dimension) of the bounding box.

Examples found in repository?
examples/bounding_boxes.rs (line 144)
10fn main() -> Result<(), Box<dyn Error>> {
11    println!("=== Spatio - Bounding Box Examples ===\n");
12
13    // Create an in-memory database
14    let mut db = Spatio::memory()?;
15    println!("✓ Created in-memory database\n");
16
17    // ========================================
18    // 1. Basic 2D Bounding Box Operations
19    // ========================================
20    println!("1. Basic 2D Bounding Box");
21    println!("-------------------------");
22
23    // Create a bounding box for Manhattan
24    let manhattan = BoundingBox2D::new(
25        -74.0479, 40.6829, // Southwest corner (Battery Park)
26        -73.9067, 40.8820, // Northeast corner (Inwood)
27    );
28
29    println!("   Manhattan bounding box:");
30    println!(
31        "     Min: ({:.4}, {:.4})",
32        manhattan.min_x(),
33        manhattan.min_y()
34    );
35    println!(
36        "     Max: ({:.4}, {:.4})",
37        manhattan.max_x(),
38        manhattan.max_y()
39    );
40    println!(
41        "     Center: ({:.4}, {:.4})",
42        manhattan.center().x(),
43        manhattan.center().y()
44    );
45    println!(
46        "     Width: {:.4}°, Height: {:.4}°",
47        manhattan.width(),
48        manhattan.height()
49    );
50
51    // Check if points are within Manhattan
52    let times_square = Point::new(-73.9855, 40.7580);
53    let brooklyn_bridge = Point::new(-73.9969, 40.7061);
54    let statue_of_liberty = Point::new(-74.0445, 40.6892);
55    let jfk_airport = Point::new(-73.7781, 40.6413);
56
57    println!("\n   Point containment checks:");
58    println!(
59        "     Times Square: {}",
60        manhattan.contains_point(&times_square)
61    );
62    println!(
63        "     Brooklyn Bridge: {}",
64        manhattan.contains_point(&brooklyn_bridge)
65    );
66    println!(
67        "     Statue of Liberty: {}",
68        manhattan.contains_point(&statue_of_liberty)
69    );
70    println!(
71        "     JFK Airport: {}",
72        manhattan.contains_point(&jfk_airport)
73    );
74
75    // ========================================
76    // 2. Bounding Box Intersection
77    // ========================================
78    println!("\n2. Bounding Box Intersection");
79    println!("-----------------------------");
80
81    // Create bounding boxes for different NYC boroughs
82    let manhattan_bbox = BoundingBox2D::new(-74.0479, 40.6829, -73.9067, 40.8820);
83    let brooklyn_bbox = BoundingBox2D::new(-74.0421, 40.5707, -73.8333, 40.7395);
84    let queens_bbox = BoundingBox2D::new(-73.9626, 40.5431, -73.7004, 40.8007);
85
86    println!(
87        "   Manhattan ∩ Brooklyn: {}",
88        manhattan_bbox.intersects(&brooklyn_bbox)
89    );
90    println!(
91        "   Manhattan ∩ Queens: {}",
92        manhattan_bbox.intersects(&queens_bbox)
93    );
94    println!(
95        "   Brooklyn ∩ Queens: {}",
96        brooklyn_bbox.intersects(&queens_bbox)
97    );
98
99    // ========================================
100    // 3. Expanding Bounding Boxes
101    // ========================================
102    println!("\n3. Expanding Bounding Boxes");
103    println!("----------------------------");
104
105    let central_park = BoundingBox2D::new(-73.9812, 40.7644, -73.9492, 40.8003);
106    println!("   Central Park original:");
107    println!(
108        "     Width: {:.4}°, Height: {:.4}°",
109        central_park.width(),
110        central_park.height()
111    );
112
113    // Expand by 0.01 degrees (~1 km)
114    let expanded = central_park.expand(0.01);
115    println!("\n   Expanded by 0.01°:");
116    println!(
117        "     Width: {:.4}°, Height: {:.4}°",
118        expanded.width(),
119        expanded.height()
120    );
121    println!(
122        "     Growth: {:.4}° in each direction",
123        (expanded.width() - central_park.width()) / 2.0
124    );
125
126    // ========================================
127    // 4. 3D Bounding Boxes
128    // ========================================
129    println!("\n4. 3D Bounding Boxes");
130    println!("--------------------");
131
132    // Create a 3D bounding box for a tall building's footprint with height
133    let one_world_trade = BoundingBox3D::new(
134        -74.0134, 40.7127, 0.0, // Ground level southwest
135        -74.0118, 40.7143, 541.0, // Top level northeast (541m height)
136    );
137
138    println!("   One World Trade Center:");
139    println!(
140        "     Footprint: {:.4}° × {:.4}°",
141        one_world_trade.width(),
142        one_world_trade.height()
143    );
144    println!("     Height: {:.1} meters", one_world_trade.depth());
145    println!(
146        "     Volume: {:.6} cubic degrees×meters",
147        one_world_trade.volume()
148    );
149
150    let (cx, cy, cz) = one_world_trade.center();
151    println!("     Center: ({:.4}, {:.4}, {:.1}m)", cx, cy, cz);
152
153    // Check if points at different altitudes are within the building
154    println!("\n   Altitude containment checks:");
155    println!(
156        "     Ground level (0m): {}",
157        one_world_trade.contains_point(-74.0126, 40.7135, 0.0)
158    );
159    println!(
160        "     Mid-level (270m): {}",
161        one_world_trade.contains_point(-74.0126, 40.7135, 270.0)
162    );
163    println!(
164        "     Top (540m): {}",
165        one_world_trade.contains_point(-74.0126, 40.7135, 540.0)
166    );
167    println!(
168        "     Above (600m): {}",
169        one_world_trade.contains_point(-74.0126, 40.7135, 600.0)
170    );
171
172    // ========================================
173    // 5. 3D to 2D Projection
174    // ========================================
175    println!("\n5. 3D to 2D Projection");
176    println!("----------------------");
177
178    let building_3d = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 200.0);
179    let building_2d = building_3d.to_2d();
180
181    println!("   3D Bounding Box:");
182    println!(
183        "     Dimensions: {:.4}° × {:.4}° × {:.1}m",
184        building_3d.width(),
185        building_3d.height(),
186        building_3d.depth()
187    );
188
189    println!("\n   Projected to 2D:");
190    println!(
191        "     Dimensions: {:.4}° × {:.4}°",
192        building_2d.width(),
193        building_2d.height()
194    );
195
196    // ========================================
197    // 6. Temporal Bounding Boxes
198    // ========================================
199    println!("\n6. Temporal Bounding Boxes");
200    println!("--------------------------");
201
202    // Track how a delivery zone changes over time
203    let morning_zone = BoundingBox2D::new(-74.01, 40.71, -73.99, 40.73);
204    let afternoon_zone = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.74);
205
206    let morning_time = SystemTime::now();
207    let afternoon_time = SystemTime::now();
208
209    let temporal_morning = TemporalBoundingBox2D::new(morning_zone.clone(), morning_time);
210    let temporal_afternoon = TemporalBoundingBox2D::new(afternoon_zone.clone(), afternoon_time);
211
212    println!("   Morning delivery zone:");
213    println!(
214        "     Area: {:.4}° × {:.4}°",
215        temporal_morning.bbox().width(),
216        temporal_morning.bbox().height()
217    );
218
219    println!("\n   Afternoon delivery zone:");
220    println!(
221        "     Area: {:.4}° × {:.4}°",
222        temporal_afternoon.bbox().width(),
223        temporal_afternoon.bbox().height()
224    );
225
226    println!(
227        "     Expansion: {:.4}° wider, {:.4}° taller",
228        afternoon_zone.width() - morning_zone.width(),
229        afternoon_zone.height() - morning_zone.height()
230    );
231
232    // ========================================
233    // 7. Storing Bounding Boxes in Database
234    // ========================================
235    println!("\n7. Storing Bounding Boxes");
236    println!("-------------------------");
237
238    // Serialize and store bounding boxes
239    let bbox_json = serde_json::to_vec(&manhattan)?;
240    db.insert("zones:manhattan", bbox_json, None)?;
241
242    let bbox3d_json = serde_json::to_vec(&one_world_trade)?;
243    db.insert("buildings:wtc", bbox3d_json, None)?;
244
245    println!("   ✓ Stored Manhattan bounding box");
246    println!("   ✓ Stored One World Trade Center 3D box");
247
248    // Retrieve and deserialize
249    if let Some(data) = db.get("zones:manhattan")? {
250        let retrieved: BoundingBox2D = serde_json::from_slice(&data)?;
251        println!("\n   Retrieved Manhattan box:");
252        println!(
253            "     Center: ({:.4}, {:.4})",
254            retrieved.center().x(),
255            retrieved.center().y()
256        );
257    }
258
259    // ========================================
260    // 8. Practical Use Cases
261    // ========================================
262    println!("\n8. Practical Use Cases");
263    println!("----------------------");
264
265    // Geofencing
266    let delivery_area = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.75);
267    let current_location = Point::new(-74.00, 40.72);
268
269    if delivery_area.contains_point(&current_location) {
270        println!("   ✓ Delivery driver is within service area");
271    } else {
272        println!("   ✗ Delivery driver is outside service area");
273    }
274
275    // Airspace management
276    let airspace = BoundingBox3D::new(
277        -74.1, 40.6, 0.0, // Ground level
278        -73.8, 40.9, 3000.0, // 3000m ceiling
279    );
280    let drone_altitude = 150.0; // meters
281    let drone_location = (-74.0, 40.75, drone_altitude);
282
283    if airspace.contains_point(drone_location.0, drone_location.1, drone_location.2) {
284        println!("   ✓ Drone is within authorized airspace");
285    }
286
287    // Region overlap detection
288    let zone_a = BoundingBox2D::new(-74.05, 40.70, -74.00, 40.75);
289    let zone_b = BoundingBox2D::new(-74.02, 40.72, -73.97, 40.77);
290
291    if zone_a.intersects(&zone_b) {
292        println!("   ⚠ Service zones A and B overlap - coordination needed");
293    }
294
295    println!("\n=== Bounding Box Examples Complete! ===");
296    println!("\nKey Features Demonstrated:");
297    println!("  • Create and manipulate 2D/3D bounding boxes");
298    println!("  • Check point containment");
299    println!("  • Detect box intersections");
300    println!("  • Expand regions");
301    println!("  • Project 3D to 2D");
302    println!("  • Track temporal changes");
303    println!("  • Serialize and store in database");
304    println!("  • Geofencing and airspace management");
305
306    Ok(())
307}
Source

pub fn volume(&self) -> f64

Get the volume of the bounding box.

Examples found in repository?
examples/bounding_boxes.rs (line 147)
10fn main() -> Result<(), Box<dyn Error>> {
11    println!("=== Spatio - Bounding Box Examples ===\n");
12
13    // Create an in-memory database
14    let mut db = Spatio::memory()?;
15    println!("✓ Created in-memory database\n");
16
17    // ========================================
18    // 1. Basic 2D Bounding Box Operations
19    // ========================================
20    println!("1. Basic 2D Bounding Box");
21    println!("-------------------------");
22
23    // Create a bounding box for Manhattan
24    let manhattan = BoundingBox2D::new(
25        -74.0479, 40.6829, // Southwest corner (Battery Park)
26        -73.9067, 40.8820, // Northeast corner (Inwood)
27    );
28
29    println!("   Manhattan bounding box:");
30    println!(
31        "     Min: ({:.4}, {:.4})",
32        manhattan.min_x(),
33        manhattan.min_y()
34    );
35    println!(
36        "     Max: ({:.4}, {:.4})",
37        manhattan.max_x(),
38        manhattan.max_y()
39    );
40    println!(
41        "     Center: ({:.4}, {:.4})",
42        manhattan.center().x(),
43        manhattan.center().y()
44    );
45    println!(
46        "     Width: {:.4}°, Height: {:.4}°",
47        manhattan.width(),
48        manhattan.height()
49    );
50
51    // Check if points are within Manhattan
52    let times_square = Point::new(-73.9855, 40.7580);
53    let brooklyn_bridge = Point::new(-73.9969, 40.7061);
54    let statue_of_liberty = Point::new(-74.0445, 40.6892);
55    let jfk_airport = Point::new(-73.7781, 40.6413);
56
57    println!("\n   Point containment checks:");
58    println!(
59        "     Times Square: {}",
60        manhattan.contains_point(&times_square)
61    );
62    println!(
63        "     Brooklyn Bridge: {}",
64        manhattan.contains_point(&brooklyn_bridge)
65    );
66    println!(
67        "     Statue of Liberty: {}",
68        manhattan.contains_point(&statue_of_liberty)
69    );
70    println!(
71        "     JFK Airport: {}",
72        manhattan.contains_point(&jfk_airport)
73    );
74
75    // ========================================
76    // 2. Bounding Box Intersection
77    // ========================================
78    println!("\n2. Bounding Box Intersection");
79    println!("-----------------------------");
80
81    // Create bounding boxes for different NYC boroughs
82    let manhattan_bbox = BoundingBox2D::new(-74.0479, 40.6829, -73.9067, 40.8820);
83    let brooklyn_bbox = BoundingBox2D::new(-74.0421, 40.5707, -73.8333, 40.7395);
84    let queens_bbox = BoundingBox2D::new(-73.9626, 40.5431, -73.7004, 40.8007);
85
86    println!(
87        "   Manhattan ∩ Brooklyn: {}",
88        manhattan_bbox.intersects(&brooklyn_bbox)
89    );
90    println!(
91        "   Manhattan ∩ Queens: {}",
92        manhattan_bbox.intersects(&queens_bbox)
93    );
94    println!(
95        "   Brooklyn ∩ Queens: {}",
96        brooklyn_bbox.intersects(&queens_bbox)
97    );
98
99    // ========================================
100    // 3. Expanding Bounding Boxes
101    // ========================================
102    println!("\n3. Expanding Bounding Boxes");
103    println!("----------------------------");
104
105    let central_park = BoundingBox2D::new(-73.9812, 40.7644, -73.9492, 40.8003);
106    println!("   Central Park original:");
107    println!(
108        "     Width: {:.4}°, Height: {:.4}°",
109        central_park.width(),
110        central_park.height()
111    );
112
113    // Expand by 0.01 degrees (~1 km)
114    let expanded = central_park.expand(0.01);
115    println!("\n   Expanded by 0.01°:");
116    println!(
117        "     Width: {:.4}°, Height: {:.4}°",
118        expanded.width(),
119        expanded.height()
120    );
121    println!(
122        "     Growth: {:.4}° in each direction",
123        (expanded.width() - central_park.width()) / 2.0
124    );
125
126    // ========================================
127    // 4. 3D Bounding Boxes
128    // ========================================
129    println!("\n4. 3D Bounding Boxes");
130    println!("--------------------");
131
132    // Create a 3D bounding box for a tall building's footprint with height
133    let one_world_trade = BoundingBox3D::new(
134        -74.0134, 40.7127, 0.0, // Ground level southwest
135        -74.0118, 40.7143, 541.0, // Top level northeast (541m height)
136    );
137
138    println!("   One World Trade Center:");
139    println!(
140        "     Footprint: {:.4}° × {:.4}°",
141        one_world_trade.width(),
142        one_world_trade.height()
143    );
144    println!("     Height: {:.1} meters", one_world_trade.depth());
145    println!(
146        "     Volume: {:.6} cubic degrees×meters",
147        one_world_trade.volume()
148    );
149
150    let (cx, cy, cz) = one_world_trade.center();
151    println!("     Center: ({:.4}, {:.4}, {:.1}m)", cx, cy, cz);
152
153    // Check if points at different altitudes are within the building
154    println!("\n   Altitude containment checks:");
155    println!(
156        "     Ground level (0m): {}",
157        one_world_trade.contains_point(-74.0126, 40.7135, 0.0)
158    );
159    println!(
160        "     Mid-level (270m): {}",
161        one_world_trade.contains_point(-74.0126, 40.7135, 270.0)
162    );
163    println!(
164        "     Top (540m): {}",
165        one_world_trade.contains_point(-74.0126, 40.7135, 540.0)
166    );
167    println!(
168        "     Above (600m): {}",
169        one_world_trade.contains_point(-74.0126, 40.7135, 600.0)
170    );
171
172    // ========================================
173    // 5. 3D to 2D Projection
174    // ========================================
175    println!("\n5. 3D to 2D Projection");
176    println!("----------------------");
177
178    let building_3d = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 200.0);
179    let building_2d = building_3d.to_2d();
180
181    println!("   3D Bounding Box:");
182    println!(
183        "     Dimensions: {:.4}° × {:.4}° × {:.1}m",
184        building_3d.width(),
185        building_3d.height(),
186        building_3d.depth()
187    );
188
189    println!("\n   Projected to 2D:");
190    println!(
191        "     Dimensions: {:.4}° × {:.4}°",
192        building_2d.width(),
193        building_2d.height()
194    );
195
196    // ========================================
197    // 6. Temporal Bounding Boxes
198    // ========================================
199    println!("\n6. Temporal Bounding Boxes");
200    println!("--------------------------");
201
202    // Track how a delivery zone changes over time
203    let morning_zone = BoundingBox2D::new(-74.01, 40.71, -73.99, 40.73);
204    let afternoon_zone = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.74);
205
206    let morning_time = SystemTime::now();
207    let afternoon_time = SystemTime::now();
208
209    let temporal_morning = TemporalBoundingBox2D::new(morning_zone.clone(), morning_time);
210    let temporal_afternoon = TemporalBoundingBox2D::new(afternoon_zone.clone(), afternoon_time);
211
212    println!("   Morning delivery zone:");
213    println!(
214        "     Area: {:.4}° × {:.4}°",
215        temporal_morning.bbox().width(),
216        temporal_morning.bbox().height()
217    );
218
219    println!("\n   Afternoon delivery zone:");
220    println!(
221        "     Area: {:.4}° × {:.4}°",
222        temporal_afternoon.bbox().width(),
223        temporal_afternoon.bbox().height()
224    );
225
226    println!(
227        "     Expansion: {:.4}° wider, {:.4}° taller",
228        afternoon_zone.width() - morning_zone.width(),
229        afternoon_zone.height() - morning_zone.height()
230    );
231
232    // ========================================
233    // 7. Storing Bounding Boxes in Database
234    // ========================================
235    println!("\n7. Storing Bounding Boxes");
236    println!("-------------------------");
237
238    // Serialize and store bounding boxes
239    let bbox_json = serde_json::to_vec(&manhattan)?;
240    db.insert("zones:manhattan", bbox_json, None)?;
241
242    let bbox3d_json = serde_json::to_vec(&one_world_trade)?;
243    db.insert("buildings:wtc", bbox3d_json, None)?;
244
245    println!("   ✓ Stored Manhattan bounding box");
246    println!("   ✓ Stored One World Trade Center 3D box");
247
248    // Retrieve and deserialize
249    if let Some(data) = db.get("zones:manhattan")? {
250        let retrieved: BoundingBox2D = serde_json::from_slice(&data)?;
251        println!("\n   Retrieved Manhattan box:");
252        println!(
253            "     Center: ({:.4}, {:.4})",
254            retrieved.center().x(),
255            retrieved.center().y()
256        );
257    }
258
259    // ========================================
260    // 8. Practical Use Cases
261    // ========================================
262    println!("\n8. Practical Use Cases");
263    println!("----------------------");
264
265    // Geofencing
266    let delivery_area = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.75);
267    let current_location = Point::new(-74.00, 40.72);
268
269    if delivery_area.contains_point(&current_location) {
270        println!("   ✓ Delivery driver is within service area");
271    } else {
272        println!("   ✗ Delivery driver is outside service area");
273    }
274
275    // Airspace management
276    let airspace = BoundingBox3D::new(
277        -74.1, 40.6, 0.0, // Ground level
278        -73.8, 40.9, 3000.0, // 3000m ceiling
279    );
280    let drone_altitude = 150.0; // meters
281    let drone_location = (-74.0, 40.75, drone_altitude);
282
283    if airspace.contains_point(drone_location.0, drone_location.1, drone_location.2) {
284        println!("   ✓ Drone is within authorized airspace");
285    }
286
287    // Region overlap detection
288    let zone_a = BoundingBox2D::new(-74.05, 40.70, -74.00, 40.75);
289    let zone_b = BoundingBox2D::new(-74.02, 40.72, -73.97, 40.77);
290
291    if zone_a.intersects(&zone_b) {
292        println!("   ⚠ Service zones A and B overlap - coordination needed");
293    }
294
295    println!("\n=== Bounding Box Examples Complete! ===");
296    println!("\nKey Features Demonstrated:");
297    println!("  • Create and manipulate 2D/3D bounding boxes");
298    println!("  • Check point containment");
299    println!("  • Detect box intersections");
300    println!("  • Expand regions");
301    println!("  • Project 3D to 2D");
302    println!("  • Track temporal changes");
303    println!("  • Serialize and store in database");
304    println!("  • Geofencing and airspace management");
305
306    Ok(())
307}
Source

pub fn contains_point(&self, x: f64, y: f64, z: f64) -> bool

Check if a 3D point is contained within this bounding box.

Examples found in repository?
examples/bounding_boxes.rs (line 157)
10fn main() -> Result<(), Box<dyn Error>> {
11    println!("=== Spatio - Bounding Box Examples ===\n");
12
13    // Create an in-memory database
14    let mut db = Spatio::memory()?;
15    println!("✓ Created in-memory database\n");
16
17    // ========================================
18    // 1. Basic 2D Bounding Box Operations
19    // ========================================
20    println!("1. Basic 2D Bounding Box");
21    println!("-------------------------");
22
23    // Create a bounding box for Manhattan
24    let manhattan = BoundingBox2D::new(
25        -74.0479, 40.6829, // Southwest corner (Battery Park)
26        -73.9067, 40.8820, // Northeast corner (Inwood)
27    );
28
29    println!("   Manhattan bounding box:");
30    println!(
31        "     Min: ({:.4}, {:.4})",
32        manhattan.min_x(),
33        manhattan.min_y()
34    );
35    println!(
36        "     Max: ({:.4}, {:.4})",
37        manhattan.max_x(),
38        manhattan.max_y()
39    );
40    println!(
41        "     Center: ({:.4}, {:.4})",
42        manhattan.center().x(),
43        manhattan.center().y()
44    );
45    println!(
46        "     Width: {:.4}°, Height: {:.4}°",
47        manhattan.width(),
48        manhattan.height()
49    );
50
51    // Check if points are within Manhattan
52    let times_square = Point::new(-73.9855, 40.7580);
53    let brooklyn_bridge = Point::new(-73.9969, 40.7061);
54    let statue_of_liberty = Point::new(-74.0445, 40.6892);
55    let jfk_airport = Point::new(-73.7781, 40.6413);
56
57    println!("\n   Point containment checks:");
58    println!(
59        "     Times Square: {}",
60        manhattan.contains_point(&times_square)
61    );
62    println!(
63        "     Brooklyn Bridge: {}",
64        manhattan.contains_point(&brooklyn_bridge)
65    );
66    println!(
67        "     Statue of Liberty: {}",
68        manhattan.contains_point(&statue_of_liberty)
69    );
70    println!(
71        "     JFK Airport: {}",
72        manhattan.contains_point(&jfk_airport)
73    );
74
75    // ========================================
76    // 2. Bounding Box Intersection
77    // ========================================
78    println!("\n2. Bounding Box Intersection");
79    println!("-----------------------------");
80
81    // Create bounding boxes for different NYC boroughs
82    let manhattan_bbox = BoundingBox2D::new(-74.0479, 40.6829, -73.9067, 40.8820);
83    let brooklyn_bbox = BoundingBox2D::new(-74.0421, 40.5707, -73.8333, 40.7395);
84    let queens_bbox = BoundingBox2D::new(-73.9626, 40.5431, -73.7004, 40.8007);
85
86    println!(
87        "   Manhattan ∩ Brooklyn: {}",
88        manhattan_bbox.intersects(&brooklyn_bbox)
89    );
90    println!(
91        "   Manhattan ∩ Queens: {}",
92        manhattan_bbox.intersects(&queens_bbox)
93    );
94    println!(
95        "   Brooklyn ∩ Queens: {}",
96        brooklyn_bbox.intersects(&queens_bbox)
97    );
98
99    // ========================================
100    // 3. Expanding Bounding Boxes
101    // ========================================
102    println!("\n3. Expanding Bounding Boxes");
103    println!("----------------------------");
104
105    let central_park = BoundingBox2D::new(-73.9812, 40.7644, -73.9492, 40.8003);
106    println!("   Central Park original:");
107    println!(
108        "     Width: {:.4}°, Height: {:.4}°",
109        central_park.width(),
110        central_park.height()
111    );
112
113    // Expand by 0.01 degrees (~1 km)
114    let expanded = central_park.expand(0.01);
115    println!("\n   Expanded by 0.01°:");
116    println!(
117        "     Width: {:.4}°, Height: {:.4}°",
118        expanded.width(),
119        expanded.height()
120    );
121    println!(
122        "     Growth: {:.4}° in each direction",
123        (expanded.width() - central_park.width()) / 2.0
124    );
125
126    // ========================================
127    // 4. 3D Bounding Boxes
128    // ========================================
129    println!("\n4. 3D Bounding Boxes");
130    println!("--------------------");
131
132    // Create a 3D bounding box for a tall building's footprint with height
133    let one_world_trade = BoundingBox3D::new(
134        -74.0134, 40.7127, 0.0, // Ground level southwest
135        -74.0118, 40.7143, 541.0, // Top level northeast (541m height)
136    );
137
138    println!("   One World Trade Center:");
139    println!(
140        "     Footprint: {:.4}° × {:.4}°",
141        one_world_trade.width(),
142        one_world_trade.height()
143    );
144    println!("     Height: {:.1} meters", one_world_trade.depth());
145    println!(
146        "     Volume: {:.6} cubic degrees×meters",
147        one_world_trade.volume()
148    );
149
150    let (cx, cy, cz) = one_world_trade.center();
151    println!("     Center: ({:.4}, {:.4}, {:.1}m)", cx, cy, cz);
152
153    // Check if points at different altitudes are within the building
154    println!("\n   Altitude containment checks:");
155    println!(
156        "     Ground level (0m): {}",
157        one_world_trade.contains_point(-74.0126, 40.7135, 0.0)
158    );
159    println!(
160        "     Mid-level (270m): {}",
161        one_world_trade.contains_point(-74.0126, 40.7135, 270.0)
162    );
163    println!(
164        "     Top (540m): {}",
165        one_world_trade.contains_point(-74.0126, 40.7135, 540.0)
166    );
167    println!(
168        "     Above (600m): {}",
169        one_world_trade.contains_point(-74.0126, 40.7135, 600.0)
170    );
171
172    // ========================================
173    // 5. 3D to 2D Projection
174    // ========================================
175    println!("\n5. 3D to 2D Projection");
176    println!("----------------------");
177
178    let building_3d = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 200.0);
179    let building_2d = building_3d.to_2d();
180
181    println!("   3D Bounding Box:");
182    println!(
183        "     Dimensions: {:.4}° × {:.4}° × {:.1}m",
184        building_3d.width(),
185        building_3d.height(),
186        building_3d.depth()
187    );
188
189    println!("\n   Projected to 2D:");
190    println!(
191        "     Dimensions: {:.4}° × {:.4}°",
192        building_2d.width(),
193        building_2d.height()
194    );
195
196    // ========================================
197    // 6. Temporal Bounding Boxes
198    // ========================================
199    println!("\n6. Temporal Bounding Boxes");
200    println!("--------------------------");
201
202    // Track how a delivery zone changes over time
203    let morning_zone = BoundingBox2D::new(-74.01, 40.71, -73.99, 40.73);
204    let afternoon_zone = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.74);
205
206    let morning_time = SystemTime::now();
207    let afternoon_time = SystemTime::now();
208
209    let temporal_morning = TemporalBoundingBox2D::new(morning_zone.clone(), morning_time);
210    let temporal_afternoon = TemporalBoundingBox2D::new(afternoon_zone.clone(), afternoon_time);
211
212    println!("   Morning delivery zone:");
213    println!(
214        "     Area: {:.4}° × {:.4}°",
215        temporal_morning.bbox().width(),
216        temporal_morning.bbox().height()
217    );
218
219    println!("\n   Afternoon delivery zone:");
220    println!(
221        "     Area: {:.4}° × {:.4}°",
222        temporal_afternoon.bbox().width(),
223        temporal_afternoon.bbox().height()
224    );
225
226    println!(
227        "     Expansion: {:.4}° wider, {:.4}° taller",
228        afternoon_zone.width() - morning_zone.width(),
229        afternoon_zone.height() - morning_zone.height()
230    );
231
232    // ========================================
233    // 7. Storing Bounding Boxes in Database
234    // ========================================
235    println!("\n7. Storing Bounding Boxes");
236    println!("-------------------------");
237
238    // Serialize and store bounding boxes
239    let bbox_json = serde_json::to_vec(&manhattan)?;
240    db.insert("zones:manhattan", bbox_json, None)?;
241
242    let bbox3d_json = serde_json::to_vec(&one_world_trade)?;
243    db.insert("buildings:wtc", bbox3d_json, None)?;
244
245    println!("   ✓ Stored Manhattan bounding box");
246    println!("   ✓ Stored One World Trade Center 3D box");
247
248    // Retrieve and deserialize
249    if let Some(data) = db.get("zones:manhattan")? {
250        let retrieved: BoundingBox2D = serde_json::from_slice(&data)?;
251        println!("\n   Retrieved Manhattan box:");
252        println!(
253            "     Center: ({:.4}, {:.4})",
254            retrieved.center().x(),
255            retrieved.center().y()
256        );
257    }
258
259    // ========================================
260    // 8. Practical Use Cases
261    // ========================================
262    println!("\n8. Practical Use Cases");
263    println!("----------------------");
264
265    // Geofencing
266    let delivery_area = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.75);
267    let current_location = Point::new(-74.00, 40.72);
268
269    if delivery_area.contains_point(&current_location) {
270        println!("   ✓ Delivery driver is within service area");
271    } else {
272        println!("   ✗ Delivery driver is outside service area");
273    }
274
275    // Airspace management
276    let airspace = BoundingBox3D::new(
277        -74.1, 40.6, 0.0, // Ground level
278        -73.8, 40.9, 3000.0, // 3000m ceiling
279    );
280    let drone_altitude = 150.0; // meters
281    let drone_location = (-74.0, 40.75, drone_altitude);
282
283    if airspace.contains_point(drone_location.0, drone_location.1, drone_location.2) {
284        println!("   ✓ Drone is within authorized airspace");
285    }
286
287    // Region overlap detection
288    let zone_a = BoundingBox2D::new(-74.05, 40.70, -74.00, 40.75);
289    let zone_b = BoundingBox2D::new(-74.02, 40.72, -73.97, 40.77);
290
291    if zone_a.intersects(&zone_b) {
292        println!("   ⚠ Service zones A and B overlap - coordination needed");
293    }
294
295    println!("\n=== Bounding Box Examples Complete! ===");
296    println!("\nKey Features Demonstrated:");
297    println!("  • Create and manipulate 2D/3D bounding boxes");
298    println!("  • Check point containment");
299    println!("  • Detect box intersections");
300    println!("  • Expand regions");
301    println!("  • Project 3D to 2D");
302    println!("  • Track temporal changes");
303    println!("  • Serialize and store in database");
304    println!("  • Geofencing and airspace management");
305
306    Ok(())
307}
Source

pub fn intersects(&self, other: &BoundingBox3D) -> bool

Check if this bounding box intersects with another 3D bounding box.

Source

pub fn expand(&self, amount: f64) -> BoundingBox3D

Expand the bounding box by a given amount in all directions.

Source

pub fn to_2d(&self) -> BoundingBox2D

Project the 3D bounding box to a 2D bounding box (discarding z).

Examples found in repository?
examples/bounding_boxes.rs (line 179)
10fn main() -> Result<(), Box<dyn Error>> {
11    println!("=== Spatio - Bounding Box Examples ===\n");
12
13    // Create an in-memory database
14    let mut db = Spatio::memory()?;
15    println!("✓ Created in-memory database\n");
16
17    // ========================================
18    // 1. Basic 2D Bounding Box Operations
19    // ========================================
20    println!("1. Basic 2D Bounding Box");
21    println!("-------------------------");
22
23    // Create a bounding box for Manhattan
24    let manhattan = BoundingBox2D::new(
25        -74.0479, 40.6829, // Southwest corner (Battery Park)
26        -73.9067, 40.8820, // Northeast corner (Inwood)
27    );
28
29    println!("   Manhattan bounding box:");
30    println!(
31        "     Min: ({:.4}, {:.4})",
32        manhattan.min_x(),
33        manhattan.min_y()
34    );
35    println!(
36        "     Max: ({:.4}, {:.4})",
37        manhattan.max_x(),
38        manhattan.max_y()
39    );
40    println!(
41        "     Center: ({:.4}, {:.4})",
42        manhattan.center().x(),
43        manhattan.center().y()
44    );
45    println!(
46        "     Width: {:.4}°, Height: {:.4}°",
47        manhattan.width(),
48        manhattan.height()
49    );
50
51    // Check if points are within Manhattan
52    let times_square = Point::new(-73.9855, 40.7580);
53    let brooklyn_bridge = Point::new(-73.9969, 40.7061);
54    let statue_of_liberty = Point::new(-74.0445, 40.6892);
55    let jfk_airport = Point::new(-73.7781, 40.6413);
56
57    println!("\n   Point containment checks:");
58    println!(
59        "     Times Square: {}",
60        manhattan.contains_point(&times_square)
61    );
62    println!(
63        "     Brooklyn Bridge: {}",
64        manhattan.contains_point(&brooklyn_bridge)
65    );
66    println!(
67        "     Statue of Liberty: {}",
68        manhattan.contains_point(&statue_of_liberty)
69    );
70    println!(
71        "     JFK Airport: {}",
72        manhattan.contains_point(&jfk_airport)
73    );
74
75    // ========================================
76    // 2. Bounding Box Intersection
77    // ========================================
78    println!("\n2. Bounding Box Intersection");
79    println!("-----------------------------");
80
81    // Create bounding boxes for different NYC boroughs
82    let manhattan_bbox = BoundingBox2D::new(-74.0479, 40.6829, -73.9067, 40.8820);
83    let brooklyn_bbox = BoundingBox2D::new(-74.0421, 40.5707, -73.8333, 40.7395);
84    let queens_bbox = BoundingBox2D::new(-73.9626, 40.5431, -73.7004, 40.8007);
85
86    println!(
87        "   Manhattan ∩ Brooklyn: {}",
88        manhattan_bbox.intersects(&brooklyn_bbox)
89    );
90    println!(
91        "   Manhattan ∩ Queens: {}",
92        manhattan_bbox.intersects(&queens_bbox)
93    );
94    println!(
95        "   Brooklyn ∩ Queens: {}",
96        brooklyn_bbox.intersects(&queens_bbox)
97    );
98
99    // ========================================
100    // 3. Expanding Bounding Boxes
101    // ========================================
102    println!("\n3. Expanding Bounding Boxes");
103    println!("----------------------------");
104
105    let central_park = BoundingBox2D::new(-73.9812, 40.7644, -73.9492, 40.8003);
106    println!("   Central Park original:");
107    println!(
108        "     Width: {:.4}°, Height: {:.4}°",
109        central_park.width(),
110        central_park.height()
111    );
112
113    // Expand by 0.01 degrees (~1 km)
114    let expanded = central_park.expand(0.01);
115    println!("\n   Expanded by 0.01°:");
116    println!(
117        "     Width: {:.4}°, Height: {:.4}°",
118        expanded.width(),
119        expanded.height()
120    );
121    println!(
122        "     Growth: {:.4}° in each direction",
123        (expanded.width() - central_park.width()) / 2.0
124    );
125
126    // ========================================
127    // 4. 3D Bounding Boxes
128    // ========================================
129    println!("\n4. 3D Bounding Boxes");
130    println!("--------------------");
131
132    // Create a 3D bounding box for a tall building's footprint with height
133    let one_world_trade = BoundingBox3D::new(
134        -74.0134, 40.7127, 0.0, // Ground level southwest
135        -74.0118, 40.7143, 541.0, // Top level northeast (541m height)
136    );
137
138    println!("   One World Trade Center:");
139    println!(
140        "     Footprint: {:.4}° × {:.4}°",
141        one_world_trade.width(),
142        one_world_trade.height()
143    );
144    println!("     Height: {:.1} meters", one_world_trade.depth());
145    println!(
146        "     Volume: {:.6} cubic degrees×meters",
147        one_world_trade.volume()
148    );
149
150    let (cx, cy, cz) = one_world_trade.center();
151    println!("     Center: ({:.4}, {:.4}, {:.1}m)", cx, cy, cz);
152
153    // Check if points at different altitudes are within the building
154    println!("\n   Altitude containment checks:");
155    println!(
156        "     Ground level (0m): {}",
157        one_world_trade.contains_point(-74.0126, 40.7135, 0.0)
158    );
159    println!(
160        "     Mid-level (270m): {}",
161        one_world_trade.contains_point(-74.0126, 40.7135, 270.0)
162    );
163    println!(
164        "     Top (540m): {}",
165        one_world_trade.contains_point(-74.0126, 40.7135, 540.0)
166    );
167    println!(
168        "     Above (600m): {}",
169        one_world_trade.contains_point(-74.0126, 40.7135, 600.0)
170    );
171
172    // ========================================
173    // 5. 3D to 2D Projection
174    // ========================================
175    println!("\n5. 3D to 2D Projection");
176    println!("----------------------");
177
178    let building_3d = BoundingBox3D::new(-74.0, 40.7, 0.0, -73.9, 40.8, 200.0);
179    let building_2d = building_3d.to_2d();
180
181    println!("   3D Bounding Box:");
182    println!(
183        "     Dimensions: {:.4}° × {:.4}° × {:.1}m",
184        building_3d.width(),
185        building_3d.height(),
186        building_3d.depth()
187    );
188
189    println!("\n   Projected to 2D:");
190    println!(
191        "     Dimensions: {:.4}° × {:.4}°",
192        building_2d.width(),
193        building_2d.height()
194    );
195
196    // ========================================
197    // 6. Temporal Bounding Boxes
198    // ========================================
199    println!("\n6. Temporal Bounding Boxes");
200    println!("--------------------------");
201
202    // Track how a delivery zone changes over time
203    let morning_zone = BoundingBox2D::new(-74.01, 40.71, -73.99, 40.73);
204    let afternoon_zone = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.74);
205
206    let morning_time = SystemTime::now();
207    let afternoon_time = SystemTime::now();
208
209    let temporal_morning = TemporalBoundingBox2D::new(morning_zone.clone(), morning_time);
210    let temporal_afternoon = TemporalBoundingBox2D::new(afternoon_zone.clone(), afternoon_time);
211
212    println!("   Morning delivery zone:");
213    println!(
214        "     Area: {:.4}° × {:.4}°",
215        temporal_morning.bbox().width(),
216        temporal_morning.bbox().height()
217    );
218
219    println!("\n   Afternoon delivery zone:");
220    println!(
221        "     Area: {:.4}° × {:.4}°",
222        temporal_afternoon.bbox().width(),
223        temporal_afternoon.bbox().height()
224    );
225
226    println!(
227        "     Expansion: {:.4}° wider, {:.4}° taller",
228        afternoon_zone.width() - morning_zone.width(),
229        afternoon_zone.height() - morning_zone.height()
230    );
231
232    // ========================================
233    // 7. Storing Bounding Boxes in Database
234    // ========================================
235    println!("\n7. Storing Bounding Boxes");
236    println!("-------------------------");
237
238    // Serialize and store bounding boxes
239    let bbox_json = serde_json::to_vec(&manhattan)?;
240    db.insert("zones:manhattan", bbox_json, None)?;
241
242    let bbox3d_json = serde_json::to_vec(&one_world_trade)?;
243    db.insert("buildings:wtc", bbox3d_json, None)?;
244
245    println!("   ✓ Stored Manhattan bounding box");
246    println!("   ✓ Stored One World Trade Center 3D box");
247
248    // Retrieve and deserialize
249    if let Some(data) = db.get("zones:manhattan")? {
250        let retrieved: BoundingBox2D = serde_json::from_slice(&data)?;
251        println!("\n   Retrieved Manhattan box:");
252        println!(
253            "     Center: ({:.4}, {:.4})",
254            retrieved.center().x(),
255            retrieved.center().y()
256        );
257    }
258
259    // ========================================
260    // 8. Practical Use Cases
261    // ========================================
262    println!("\n8. Practical Use Cases");
263    println!("----------------------");
264
265    // Geofencing
266    let delivery_area = BoundingBox2D::new(-74.02, 40.70, -73.98, 40.75);
267    let current_location = Point::new(-74.00, 40.72);
268
269    if delivery_area.contains_point(&current_location) {
270        println!("   ✓ Delivery driver is within service area");
271    } else {
272        println!("   ✗ Delivery driver is outside service area");
273    }
274
275    // Airspace management
276    let airspace = BoundingBox3D::new(
277        -74.1, 40.6, 0.0, // Ground level
278        -73.8, 40.9, 3000.0, // 3000m ceiling
279    );
280    let drone_altitude = 150.0; // meters
281    let drone_location = (-74.0, 40.75, drone_altitude);
282
283    if airspace.contains_point(drone_location.0, drone_location.1, drone_location.2) {
284        println!("   ✓ Drone is within authorized airspace");
285    }
286
287    // Region overlap detection
288    let zone_a = BoundingBox2D::new(-74.05, 40.70, -74.00, 40.75);
289    let zone_b = BoundingBox2D::new(-74.02, 40.72, -73.97, 40.77);
290
291    if zone_a.intersects(&zone_b) {
292        println!("   ⚠ Service zones A and B overlap - coordination needed");
293    }
294
295    println!("\n=== Bounding Box Examples Complete! ===");
296    println!("\nKey Features Demonstrated:");
297    println!("  • Create and manipulate 2D/3D bounding boxes");
298    println!("  • Check point containment");
299    println!("  • Detect box intersections");
300    println!("  • Expand regions");
301    println!("  • Project 3D to 2D");
302    println!("  • Track temporal changes");
303    println!("  • Serialize and store in database");
304    println!("  • Geofencing and airspace management");
305
306    Ok(())
307}

Trait Implementations§

Source§

impl Clone for BoundingBox3D

Source§

fn clone(&self) -> BoundingBox3D

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BoundingBox3D

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for BoundingBox3D

Source§

fn deserialize<__D>( __deserializer: __D, ) -> Result<BoundingBox3D, <__D as Deserializer<'de>>::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for BoundingBox3D

Source§

fn eq(&self, other: &BoundingBox3D) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for BoundingBox3D

Source§

fn serialize<__S>( &self, __serializer: __S, ) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for BoundingBox3D

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<G1, G2> Within<G2> for G1
where G2: Contains<G1>,

Source§

fn is_within(&self, b: &G2) -> bool

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,