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: f64Minimum x coordinate
min_y: f64Minimum y coordinate
min_z: f64Minimum z coordinate (altitude/elevation)
max_x: f64Maximum x coordinate
max_y: f64Maximum y coordinate
max_z: f64Maximum z coordinate (altitude/elevation)
Implementations§
Source§impl BoundingBox3D
impl BoundingBox3D
Sourcepub fn new(
min_x: f64,
min_y: f64,
min_z: f64,
max_x: f64,
max_y: f64,
max_z: f64,
) -> BoundingBox3D
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 coordinatemin_y- Minimum y coordinatemin_z- Minimum z coordinate (altitude/elevation)max_x- Maximum x coordinatemax_y- Maximum y coordinatemax_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?
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
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(×_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(¤t_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}Sourcepub fn center(&self) -> (f64, f64, f64)
pub fn center(&self) -> (f64, f64, f64)
Get the center point of the bounding box.
Examples found in repository?
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(×_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(¤t_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}Sourcepub fn width(&self) -> f64
pub fn width(&self) -> f64
Get the width (x dimension) of the bounding box.
Examples found in repository?
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(×_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(¤t_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}Sourcepub fn height(&self) -> f64
pub fn height(&self) -> f64
Get the height (y dimension) of the bounding box.
Examples found in repository?
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(×_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(¤t_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}Sourcepub fn depth(&self) -> f64
pub fn depth(&self) -> f64
Get the depth (z dimension) of the bounding box.
Examples found in repository?
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(×_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(¤t_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}Sourcepub fn volume(&self) -> f64
pub fn volume(&self) -> f64
Get the volume of the bounding box.
Examples found in repository?
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(×_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(¤t_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}Sourcepub fn contains_point(&self, x: f64, y: f64, z: f64) -> bool
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?
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(×_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(¤t_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}Sourcepub fn intersects(&self, other: &BoundingBox3D) -> bool
pub fn intersects(&self, other: &BoundingBox3D) -> bool
Check if this bounding box intersects with another 3D bounding box.
Sourcepub fn expand(&self, amount: f64) -> BoundingBox3D
pub fn expand(&self, amount: f64) -> BoundingBox3D
Expand the bounding box by a given amount in all directions.
Sourcepub fn to_2d(&self) -> BoundingBox2D
pub fn to_2d(&self) -> BoundingBox2D
Project the 3D bounding box to a 2D bounding box (discarding z).
Examples found in repository?
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(×_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(¤t_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
impl Clone for BoundingBox3D
Source§fn clone(&self) -> BoundingBox3D
fn clone(&self) -> BoundingBox3D
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BoundingBox3D
impl Debug for BoundingBox3D
Source§impl<'de> Deserialize<'de> for BoundingBox3D
impl<'de> Deserialize<'de> for BoundingBox3D
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<BoundingBox3D, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<BoundingBox3D, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for BoundingBox3D
impl PartialEq for BoundingBox3D
Source§impl Serialize for BoundingBox3D
impl Serialize for BoundingBox3D
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl StructuralPartialEq for BoundingBox3D
Auto Trait Implementations§
impl Freeze for BoundingBox3D
impl RefUnwindSafe for BoundingBox3D
impl Send for BoundingBox3D
impl Sync for BoundingBox3D
impl Unpin for BoundingBox3D
impl UnwindSafe for BoundingBox3D
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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