From: <pan...@li...> - 2013-03-16 07:37:50
|
branch: details: http://panotools.hg.sourceforge.net/hgweb/panotools/panotools/hgroot/panotools/libpano/rev/531cd379005d changeset: 776:531cd379005d user: tmodes date: Sat Mar 16 07:45:12 2013 +0100 description: Added Hammer projection diffstat: adjust.c | 20 +++++++++++++++++++- filter.h | 2 ++ math.c | 43 ++++++++++++++++++++++++++++++++++++++++++- panorama.h | 4 +++- parser.c | 7 +++++++ queryfeature.c | 6 ++++++ 6 files changed, 79 insertions(+), 3 deletions(-) diffs (214 lines): diff -r 6e390e07eac5 -r 531cd379005d adjust.c --- a/adjust.c Sun Mar 03 08:32:00 2013 +0100 +++ b/adjust.c Sat Mar 16 07:45:12 2013 +0100 @@ -752,6 +752,11 @@ lambertazimuthal_erect(b/2.0, 0.0, &tx, &ty, & tpara); mp->distance = pn->width/(2.0*tx); break; + case _hammer: + tpara = 1; + hammer_erect(b/2.0, 0.0, &tx, &ty, & tpara); + mp->distance = pn->width/(2.0*tx); + break; case _stereographic: tpara = 1; stereographic_erect(b/2.0, 0.0, &tx, &ty, & tpara); @@ -959,6 +964,10 @@ { SetDesc(stack[i], erect_lambertazimuthal, &(mp->distance) ); i++; // Convert lambert to equirect } + else if(pn->format == _hammer) + { + SetDesc(stack[i], erect_hammer, &(mp->distance) ); i++; // Convert hammer to equirect + } else if(pn->format == _trans_mercator) { SetDesc(stack[i], erect_transmercator, &(mp->distance) ); i++; // Convert transverse mercator to equirect @@ -1184,6 +1193,11 @@ lambertazimuthal_erect(b/2.0, 0.0, &tx, &ty, & tpara); mp->distance = pn->width/(2.0*tx); break; + case _hammer: + tpara = 1; + hammer_erect(b/2.0, 0.0, &tx, &ty, & tpara); + mp->distance = pn->width/(2.0*tx); + break; case _panini: tpara = 1; panini_erect(b/2.0, 0.0, &tx, &ty, & tpara); @@ -1458,6 +1472,10 @@ { SetDesc(stack[i], lambertazimuthal_erect, &(mp->distance) ); i++; // Convert equirectangular to lambert azimuthal } + else if(pn->format == _hammer) + { + SetDesc(stack[i], hammer_erect, &(mp->distance) ); i++; // Convert equirectangular to hammer + } else if(pn->format == _trans_mercator) { SetDesc(stack[i], transmercator_erect, &(mp->distance) ); i++; // Convert equirectangular to transverse mercator @@ -3035,7 +3053,7 @@ g->pano.format != _equisolid && g->pano.format != _equipanini && g->pano.format != _biplane && g->pano.format != _triplane && g->pano.format != _panini_general && g->pano.format != _thoby && - g->pano.format != _orthographic + g->pano.format != _orthographic && g->pano.format != _hammer ) err=11; // Check Control Points diff -r 6e390e07eac5 -r 531cd379005d filter.h --- a/filter.h Sun Mar 03 08:32:00 2013 +0100 +++ b/filter.h Sat Mar 16 07:45:12 2013 +0100 @@ -863,6 +863,8 @@ int erect_lambert ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int erect_lambertazimuthal( double x_dest,double y_dest, double* x_src, double* y_src, void* params); int lambertazimuthal_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params); +int erect_hammer( double x_dest,double y_dest, double* x_src, double* y_src, void* params); +int hammer_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params); int transmercator_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int erect_transmercator ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); int sinusoidal_erect ( double x_dest,double y_dest, double* x_src, double* y_src, void* params ); diff -r 6e390e07eac5 -r 531cd379005d math.c --- a/math.c Sun Mar 03 08:32:00 2013 +0100 +++ b/math.c Sat Mar 16 07:45:12 2013 +0100 @@ -874,7 +874,48 @@ return 1; } - +/** convert from erect to hammer */ +int hammer_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) +{ + if(lambertazimuthal_erect(x_dest/2.0, y_dest, x_src, y_src, params)) + { + *x_src *= 2.0; + return 1; + } + else + { + *x_src=0; + *y_src=0; + return 0; + }; +} + +/** convert from hammer to erect */ +int erect_hammer( double x_dest,double y_dest, double* x_src, double* y_src, void* params) +{ + double x, y, z; + x = x_dest/distanceparam; + y = y_dest/distanceparam; + z = 1.0 - (x * x / 16.0) - (y * y / 4.0); + if(z<0) + { + *x_src=0; + *y_src=0; + return 0; + }; + z = sqrt(z); + *x_src = 2.0 * atan2(z*x, 2.0*(2.0*z*z-1.0)); + *y_src = asin(y*z); + if(fabs(*x_src) > PI || fabs(*y_src) > HALF_PI) + { + *x_src=0; + *y_src=0; + return 0; + }; + *x_src *= distanceparam; + *y_src *= distanceparam; + return 1; +} /** convert from erect to mercator FORWARD */ int mercator_erect( double x_dest,double y_dest, double* x_src, double* y_src, void* params) diff -r 6e390e07eac5 -r 531cd379005d panorama.h --- a/panorama.h Sun Mar 03 08:32:00 2013 +0100 +++ b/panorama.h Sat Mar 16 07:45:12 2013 +0100 @@ -270,6 +270,7 @@ _panini_general = 25, _thoby = 26, // generalizes the model found in modern fisheye lenses. It is // parametrizable but it defaults to the Nikkor 10.5 fisheye lens + _hammer = 27, }; enum @@ -295,9 +296,10 @@ PANO_FORMAT_TRIPLANE = 18, PANO_FORMAT_PANINI_GENERAL = 19, PANO_FORMAT_THOBY = 20, + PANO_FORMAT_HAMMER = 21, }; -#define PANO_FORMAT_COUNT 21 +#define PANO_FORMAT_COUNT 22 enum { // Enumerates external number of image f<index> diff -r 6e390e07eac5 -r 531cd379005d parser.c --- a/parser.c Sun Mar 03 08:32:00 2013 +0100 +++ b/parser.c Sat Mar 16 07:45:12 2013 +0100 @@ -690,6 +690,9 @@ case PANO_FORMAT_LAMBERT_AZIMUTHAL: gl->pano.format = _lambertazimuthal; break; + case PANO_FORMAT_HAMMER: + gl->pano.format = _hammer; + break; case PANO_FORMAT_ALBERS_EQUAL_AREA_CONIC: gl->pano.format = _albersequalareaconic; break; @@ -920,6 +923,7 @@ case _sinusoidal: format = PANO_FORMAT_SINUSOIDAL; break; case _lambert: format = PANO_FORMAT_LAMBERT_EQUAL_AREA_CONIC; break; case _lambertazimuthal: format = PANO_FORMAT_LAMBERT_AZIMUTHAL; break; + case _hammer: format = PANO_FORMAT_HAMMER; break; case _albersequalareaconic: format = PANO_FORMAT_ALBERS_EQUAL_AREA_CONIC; break; case _millercylindrical: format = PANO_FORMAT_MILLER_CYLINDRICAL; break; case _panini: format = PANO_FORMAT_PANINI; break; @@ -1285,6 +1289,9 @@ case PANO_FORMAT_LAMBERT_AZIMUTHAL: p->pano.format = _lambertazimuthal; break; + case PANO_FORMAT_HAMMER: + p->pano.format = _hammer; + break; case PANO_FORMAT_ALBERS_EQUAL_AREA_CONIC: p->pano.format = _albersequalareaconic; break; diff -r 6e390e07eac5 -r 531cd379005d queryfeature.c --- a/queryfeature.c Sun Mar 03 08:32:00 2013 +0100 +++ b/queryfeature.c Sat Mar 16 07:45:12 2013 +0100 @@ -96,6 +96,9 @@ {"PanoType16","Equirectangular Panini"}, {"PanoType17","Biplane"}, {"PanoType18","Triplane"}, + {"PanoType19","Panini General"}, + {"PanoType20", "Thoby Projection"}, + {"PanoType21", "Hammer-Aitoff Equal Area"}, // Filter Types @@ -344,6 +347,7 @@ "Triplane", "Panini General", "Thoby Projection", + "Hammer-Aitoff Equal Area", }; static int panoFormatID[] = { @@ -368,6 +372,7 @@ _triplane, _panini_general, _thoby, + _hammer, }; @@ -465,6 +470,7 @@ case PANO_FORMAT_SINUSOIDAL: case PANO_FORMAT_LAMBERT_EQUAL_AREA_CONIC: case PANO_FORMAT_LAMBERT_AZIMUTHAL: + case PANO_FORMAT_HAMMER: break; case PANO_FORMAT_ALBERS_EQUAL_AREA_CONIC: features->numberOfParameters = 2; |