78 lines
2.1 KiB
C++
78 lines
2.1 KiB
C++
/*
|
|
* RenderItemMatcher.hpp
|
|
*
|
|
* Created on: Feb 16, 2009
|
|
* Author: struktured
|
|
*/
|
|
|
|
#ifndef RenderItemMatcher_HPP
|
|
#define RenderItemMatcher_HPP
|
|
|
|
#include "RenderItemDistanceMetric.hpp"
|
|
#include <vector>
|
|
#include <map>
|
|
#include <iostream>
|
|
#include "HungarianMethod.hpp"
|
|
|
|
typedef std::vector<std::pair<RenderItem*, RenderItem*> > RenderItemMatchList;
|
|
|
|
class MatchResults;
|
|
|
|
class RenderItemMatcher : public std::binary_function<RenderItemList, RenderItemList, MatchResults> {
|
|
|
|
public:
|
|
|
|
struct MatchResults {
|
|
RenderItemMatchList matches;
|
|
std::vector<RenderItem*> unmatchedLeft;
|
|
std::vector<RenderItem*> unmatchedRight;
|
|
|
|
double error;
|
|
};
|
|
|
|
static const std::size_t MAXIMUM_SET_SIZE = 1000;
|
|
|
|
/// Computes an optimal matching between two renderable item sets.
|
|
/// @param lhs the "left-hand side" list of render items.
|
|
/// @param rhs the "right-hand side" list of render items.
|
|
/// @returns a list of match pairs, possibly self referencing, and an error estimate of the matching.
|
|
inline virtual void operator()(const RenderItemList & lhs, const RenderItemList & rhs) const {
|
|
|
|
// Ensure the first argument is greater than next to aid the helper function's logic.
|
|
if (lhs.size() >= rhs.size()) {
|
|
_results.error = computeMatching(lhs, rhs);
|
|
setMatches(lhs, rhs);
|
|
} else {
|
|
_results.error = computeMatching(rhs, lhs);
|
|
setMatches(rhs, lhs);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
RenderItemMatcher() {}
|
|
virtual ~RenderItemMatcher() {}
|
|
|
|
inline MatchResults & matchResults() { return _results; }
|
|
|
|
inline double weight(int i, int j) const { return _weights[i][j]; }
|
|
|
|
MasterRenderItemDistance & distanceFunction() { return _distanceFunction; }
|
|
|
|
private:
|
|
mutable HungarianMethod<MAXIMUM_SET_SIZE> _hungarianMethod;
|
|
mutable double _weights[MAXIMUM_SET_SIZE][MAXIMUM_SET_SIZE];
|
|
|
|
mutable MatchResults _results;
|
|
|
|
/// @idea interface this entirely allow overriding of its type.
|
|
mutable MasterRenderItemDistance _distanceFunction;
|
|
|
|
double computeMatching(const RenderItemList & lhs, const RenderItemList & rhs) const;
|
|
|
|
void setMatches(const RenderItemList & lhs_src, const RenderItemList & rhs_src) const;
|
|
|
|
};
|
|
|
|
#endif
|