added RasterizedOutline2Packer::PackBestEffort() sample
This commit is contained in:
parent
6c02f53fb1
commit
9eb8672ba9
apps/sample/space_rasterized_packer
|
@ -0,0 +1,146 @@
|
||||||
|
/****************************************************************************
|
||||||
|
* VCGLib o o *
|
||||||
|
* Visual and Computer Graphics Library o o *
|
||||||
|
* _ O _ *
|
||||||
|
* Copyright(C) 2004-2019 \/)\/ *
|
||||||
|
* Visual Computing Lab /\/| *
|
||||||
|
* ISTI - Italian National Research Council | *
|
||||||
|
* \ *
|
||||||
|
* All rights reserved. *
|
||||||
|
* *
|
||||||
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
|
||||||
|
* for more details. *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <cassert>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <vcg/space/point2.h>
|
||||||
|
#include <vcg/space/point3.h>
|
||||||
|
#include <vcg/complex/algorithms/outline_support.h>
|
||||||
|
#include <wrap/qt/outline2_rasterizer.h>
|
||||||
|
#include <vcg/space/rasterized_outline2_packer.h>
|
||||||
|
|
||||||
|
#include <wrap/qt/Outline2ToQImage.h>
|
||||||
|
|
||||||
|
// This sample shows how to pack a sequence of outlines at the given scale into
|
||||||
|
// a number of containers not known in advance using the PackBestEffort()
|
||||||
|
// function
|
||||||
|
|
||||||
|
typedef std::vector<vcg::Point2f> Outline2f;
|
||||||
|
typedef vcg::RasterizedOutline2Packer<float,QtOutline2Rasterizer> RasterizedPacker;
|
||||||
|
typedef RasterizedPacker::Parameters PackingParams;
|
||||||
|
|
||||||
|
|
||||||
|
void FillOutlineVec(std::vector<Outline2f>& outlines)
|
||||||
|
{
|
||||||
|
vcg::tri::OutlineUtil<float>::BuildRandomOutlineVec(30, outlines);
|
||||||
|
for (auto& outline : outlines)
|
||||||
|
for (auto& p : outline)
|
||||||
|
p *= 200.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
// the vector of outlines to pack
|
||||||
|
std::vector<Outline2f> outlines;
|
||||||
|
FillOutlineVec(outlines);
|
||||||
|
|
||||||
|
// containerIndices maps each outline index to the container in which is packed
|
||||||
|
std::vector<int> containerIndices(outlines.size(), -1); // -1 means not packed to any container
|
||||||
|
|
||||||
|
// packingTransforms maps each outline index to its transform */
|
||||||
|
std::vector<vcg::Similarity2f> packingTransforms(outlines.size(), vcg::Similarity2f{});
|
||||||
|
|
||||||
|
/* size of the packing area */
|
||||||
|
const vcg::Point2i grid_size(400, 600);
|
||||||
|
|
||||||
|
PackingParams params;
|
||||||
|
params.costFunction = PackingParams::LowestHorizon;
|
||||||
|
params.doubleHorizon = true;
|
||||||
|
params.innerHorizon = true; /* use inner horizons to pack charts in between gaps */
|
||||||
|
params.permutations = false; /* do not use permutations (they are ignored by PackBestEffort() */
|
||||||
|
params.rotationNum = 16; /* 16 rotations per chart */
|
||||||
|
params.gutterWidth = 2; /* 2 pixels gutter */
|
||||||
|
params.minmax = false; /* do not combine costs of the two horizons when evaluating placements */
|
||||||
|
|
||||||
|
int totPacked = 0;
|
||||||
|
int nc = 0; /* current container index */
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
std::cout << "Packing into container " << nc << std::endl;
|
||||||
|
|
||||||
|
// build a vector with the outlines not yet packed, and a corresponding vector
|
||||||
|
// of indices into the 'outlines' vector
|
||||||
|
std::vector<int> outlineIndex_iter;
|
||||||
|
std::vector<Outline2f> outlines_iter;
|
||||||
|
for (unsigned i = 0; i < containerIndices.size(); ++i) {
|
||||||
|
if (containerIndices[i] == -1) {
|
||||||
|
outlineIndex_iter.push_back(i);
|
||||||
|
outlines_iter.push_back(outlines[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<vcg::Similarity2f> transforms;
|
||||||
|
std::vector<int> polyToContainer;
|
||||||
|
int numPacked = RasterizedPacker::PackBestEffort(outlines_iter, {grid_size}, transforms, polyToContainer, params);
|
||||||
|
|
||||||
|
totPacked += numPacked;
|
||||||
|
|
||||||
|
if (numPacked == 0) {
|
||||||
|
std::cerr << "Failed to pack any outline at the current iteration. Stopping." << std::endl;
|
||||||
|
std::exit(-1);
|
||||||
|
} else {
|
||||||
|
for (unsigned i = 0; i < outlines_iter.size(); ++i) {
|
||||||
|
if (polyToContainer[i] != -1) {
|
||||||
|
assert(polyToContainer[i] == 0); // We only use a single container in this example
|
||||||
|
int outline_i = outlineIndex_iter[i];
|
||||||
|
assert(containerIndices[outline_i] == -1);
|
||||||
|
containerIndices[outline_i] = nc;
|
||||||
|
packingTransforms[outline_i] = transforms[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totPacked == outlines.size())
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
nc++;
|
||||||
|
|
||||||
|
if (nc > 10)
|
||||||
|
std::cerr << "Warning: packing into more than 10 containers! (nc = " << nc << ")" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for each container, generate an image */
|
||||||
|
for (int i = 0; i < nc + 1; ++i) {
|
||||||
|
std::vector<Outline2f> outlines_iter;
|
||||||
|
std::vector<vcg::Similarity2f> transforms_iter;
|
||||||
|
for (unsigned k = 0; k < containerIndices.size(); ++k) {
|
||||||
|
assert(containerIndices[k] != -1 && "Some outlines were not packed");
|
||||||
|
if (containerIndices[k] == i) {
|
||||||
|
outlines_iter.push_back(outlines[k]);
|
||||||
|
transforms_iter.push_back(packingTransforms[k]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::string filename = std::string("container_") + std::to_string(i) + std::string(".png");
|
||||||
|
Outline2Dumper::Param pp;
|
||||||
|
pp.width = grid_size.X();
|
||||||
|
pp.height = grid_size.Y();
|
||||||
|
pp.fill = true;
|
||||||
|
pp.randomColor = true;
|
||||||
|
|
||||||
|
Outline2Dumper::dumpOutline2VecPNG(filename.c_str(), outlines_iter, transforms_iter, pp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
include(../common.pri)
|
||||||
|
QT += opengl svg
|
||||||
|
TARGET = space_rasterized_packer
|
||||||
|
SOURCES += space_rasterized_packer.cpp \
|
||||||
|
../../../../vcglib/wrap/qt/Outline2ToQImage.cpp \
|
||||||
|
../../../../vcglib/wrap/qt/outline2_rasterizer.cpp
|
Loading…
Reference in New Issue