Function rectangle_pack::pack_rects [−][src]
pub fn pack_rects<RectToPlaceId: Debug + Hash + PartialEq + Eq + Clone + Ord + PartialOrd, BinId: Debug + Hash + PartialEq + Eq + Clone + Ord + PartialOrd, GroupId: Debug + Hash + PartialEq + Eq + Clone + Ord + PartialOrd>(
rects_to_place: &GroupedRectsToPlace<RectToPlaceId, GroupId>,
target_bins: &mut BTreeMap<BinId, TargetBin>,
box_size_heuristic: &BoxSizeHeuristicFn,
more_suitable_containers_fn: &ComparePotentialContainersFn
) -> Result<RectanglePackOk<RectToPlaceId, BinId>, RectanglePackError>
Determine how to fit a set of incoming rectangles (2d or 3d) into a set of target bins.
Example
//! A basic example of packing rectangles into target bins use rectangle_pack::{ GroupedRectsToPlace, RectToInsert, pack_rects, TargetBin, volume_heuristic, contains_smallest_box }; use std::collections::BTreeMap; // A rectangle ID just needs to meet these trait bounds (ideally also Copy). // So you could use a String, PathBuf, or any other type that meets these // trat bounds. You do not have to use a custom enum. #[derive(Debug, Hash, PartialEq, Eq, Clone, Ord, PartialOrd)] enum MyCustomRectId { RectOne, RectTwo, RectThree, } // A target bin ID just needs to meet these trait bounds (ideally also Copy) // So you could use a u32, &str, or any other type that meets these // trat bounds. You do not have to use a custom enum. #[derive(Debug, Hash, PartialEq, Eq, Clone, Ord, PartialOrd)] enum MyCustomBinId { DestinationBinOne, DestinationBinTwo, } // A placement group just needs to meet these trait bounds (ideally also Copy). // // Groups allow you to ensure that a set of rectangles will be placed // into the same bin. If this isn't possible an error is returned. // // Groups are optional. // // You could use an i32, &'static str, or any other type that meets these // trat bounds. You do not have to use a custom enum. #[derive(Debug, Hash, PartialEq, Eq, Clone, Ord, PartialOrd)] enum MyCustomGroupId { GroupIdOne } let mut rects_to_place = GroupedRectsToPlace::new(); rects_to_place.push_rect( MyCustomRectId::RectOne, Some(vec![MyCustomGroupId::GroupIdOne]), RectToInsert::new(10, 20, 255) ); rects_to_place.push_rect( MyCustomRectId::RectTwo, Some(vec![MyCustomGroupId::GroupIdOne]), RectToInsert::new(5, 50, 255) ); rects_to_place.push_rect( MyCustomRectId::RectThree, None, RectToInsert::new(30, 30, 255) ); let mut target_bins = BTreeMap::new(); target_bins.insert(MyCustomBinId::DestinationBinOne, TargetBin::new(2048, 2048, 255)); target_bins.insert(MyCustomBinId::DestinationBinTwo, TargetBin::new(4096, 4096, 1020)); // Information about where each `MyCustomRectId` was placed let rectangle_placements = pack_rects( &rects_to_place, &mut target_bins, &volume_heuristic, &contains_smallest_box ).unwrap();
Algorithm
The algorithm was originally inspired by rectpack2D and then modified to work in 3D.
TODO:
Optimize - plenty of room to remove clones and duplication .. etc