00001
00027 #ifndef _BASICALGORITHMS_CALCULATEOPTIMALSCALE_H
00028 #define _BASICALGORITHMS_CALCULATEOPTIMALSCALE_H
00029
00030 #include <hugin_shared.h>
00031 #include <algorithms/PanoramaAlgorithm.h>
00032
00033 #include <panodata/PanoramaData.h>
00034
00035
00036
00037 namespace HuginBase {
00038
00039
00040 class IMPEX CalculateOptimalScale : public PanoramaAlgorithm
00041 {
00042
00043 public:
00045 CalculateOptimalScale(PanoramaData& panorama)
00046 : PanoramaAlgorithm(panorama)
00047 {}
00048
00050 virtual ~CalculateOptimalScale()
00051 {}
00052
00053
00054 public:
00056 virtual bool modifiesPanoramaData() const
00057 { return false; }
00058
00060 virtual bool runAlgorithm()
00061 {
00062 o_optimalScale = calcOptimalScale(o_panorama);
00063 return true;
00064 }
00065
00066 public:
00068 static double calcOptimalScale(PanoramaData& panorama);
00069
00073 static double calcOptimalPanoScale(const SrcPanoImage & src,
00074 const PanoramaOptions & dest);
00075
00077 virtual double getResultOptimalScale()
00078 {
00079
00080 return o_optimalScale;
00081 }
00082
00084 virtual unsigned getResultOptimalWidth()
00085 {
00086
00087 return hugin_utils::roundi(getResultOptimalScale() * o_panorama.getOptions().getWidth());
00088 }
00089
00090 protected:
00091 double o_optimalScale;
00092
00093 };
00094
00095
00096 class SetWidthOptimal : public CalculateOptimalScale
00097 {
00098 public:
00100 SetWidthOptimal(PanoramaData& panorama)
00101 : CalculateOptimalScale(panorama)
00102 {}
00103
00105 virtual ~SetWidthOptimal()
00106 {}
00107
00108
00109 public:
00111 virtual bool modifiesPanoramaData() const
00112 { return true; }
00113
00115 virtual bool runAlgorithm()
00116 {
00117 bool success = CalculateOptimalScale::runAlgorithm();
00118 if(success)
00119 {
00120 PanoramaOptions opts = o_panorama.getOptions();
00121 opts.setWidth(getResultOptimalWidth());
00122 o_panorama.setOptions(opts);
00123 }
00124 return success;
00125 }
00126 };
00127
00128
00129 }
00130 #endif