28 #include <vcg/space/point2.h>
29 #include <vcg/space/point3.h>
30 #include <vcg/complex/algorithms/outline_support.h>
31 #include <wrap/qt/outline2_rasterizer.h>
32 #include <vcg/space/rasterized_outline2_packer.h>
34 #include <wrap/qt/Outline2ToQImage.h>
40 typedef std::vector<vcg::Point2f> Outline2f;
41 typedef vcg::RasterizedOutline2Packer<float,QtOutline2Rasterizer> RasterizedPacker;
42 typedef RasterizedPacker::Parameters PackingParams;
45 void FillOutlineVec(std::vector<Outline2f>& outlines)
47 vcg::tri::OutlineUtil<float>::BuildRandomOutlineVec(30, outlines);
48 for (
auto& outline : outlines)
49 for (
auto& p : outline)
53 int main(
int argc,
char **argv)
56 std::vector<Outline2f> outlines;
57 FillOutlineVec(outlines);
60 std::vector<int> containerIndices(outlines.size(), -1);
63 std::vector<vcg::Similarity2f> packingTransforms(outlines.size(), vcg::Similarity2f{});
66 const vcg::Point2i grid_size(400, 600);
69 params.costFunction = PackingParams::LowestHorizon;
70 params.doubleHorizon =
true;
71 params.innerHorizon =
true;
72 params.permutations =
false;
73 params.rotationNum = 16;
74 params.gutterWidth = 2;
75 params.minmax =
false;
81 std::cout <<
"Packing into container " << nc << std::endl;
85 std::vector<int> outlineIndex_iter;
86 std::vector<Outline2f> outlines_iter;
87 for (
unsigned i = 0; i < containerIndices.size(); ++i) {
88 if (containerIndices[i] == -1) {
89 outlineIndex_iter.push_back(i);
90 outlines_iter.push_back(outlines[i]);
94 std::vector<vcg::Similarity2f> transforms;
95 std::vector<int> polyToContainer;
96 int numPacked = RasterizedPacker::PackBestEffort(outlines_iter, {grid_size}, transforms, polyToContainer, params);
98 totPacked += numPacked;
100 if (numPacked == 0) {
101 std::cerr <<
"Failed to pack any outline at the current iteration. Stopping." << std::endl;
104 for (
unsigned i = 0; i < outlines_iter.size(); ++i) {
105 if (polyToContainer[i] != -1) {
106 assert(polyToContainer[i] == 0);
107 int outline_i = outlineIndex_iter[i];
108 assert(containerIndices[outline_i] == -1);
109 containerIndices[outline_i] = nc;
110 packingTransforms[outline_i] = transforms[i];
115 if (totPacked == outlines.size())
121 std::cerr <<
"Warning: packing into more than 10 containers! (nc = " << nc <<
")" << std::endl;
125 for (
int i = 0; i < nc + 1; ++i) {
126 std::vector<Outline2f> outlines_iter;
127 std::vector<vcg::Similarity2f> transforms_iter;
128 for (
unsigned k = 0; k < containerIndices.size(); ++k) {
129 assert(containerIndices[k] != -1 &&
"Some outlines were not packed");
130 if (containerIndices[k] == i) {
131 outlines_iter.push_back(outlines[k]);
132 transforms_iter.push_back(packingTransforms[k]);
135 std::string filename = std::string(
"container_") + std::to_string(i) + std::string(
".png");
136 Outline2Dumper::Param pp;
137 pp.width = grid_size.X();
138 pp.height = grid_size.Y();
140 pp.randomColor =
true;
142 Outline2Dumper::dumpOutline2VecPNG(filename.c_str(), outlines_iter, transforms_iter, pp);