diff options
| author | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2026-10-26 20:05:20 +0100 |
|---|---|---|
| committer | Johannes Hofmann <Johannes.Hofmann@gmx.de> | 2026-10-26 20:05:20 +0100 |
| commit | 375d87a9b0ec1cf2fffd705adb870c86144d2400 (patch) | |
| tree | 1e8e05e7cd58686628d0f4622622456613a42e4d /tests/harness | |
| parent | 45425dd047b791fe63f13a46a3251c529cfffc94 (diff) | |
Replace the C++ implementation with the Rust port
The Rust port (formerly gipfel-rs) is now the official successor to the
FLTK/GSL C++ code base. This squashes the port into a single commit and
removes the C++ sources (they remain in the git history below).
Layout:
crates/gipfel-core headless core: hills, panorama geometry, projections
(maxima-generated derivatives), pure-Rust LM fit,
gipfel: JPEG comment + EXIF I/O, profiles, stitching
crates/gipfel-cli command-line tools (export, info, stitch, profiles)
crates/gipfel-app Cosmic DE (libcosmic) GUI, binary name `gipfel`
codegen/ maxima scripts + regen.sh for the projection code
tests/ golden files + C++ reference harnesses (historical)
The original README is kept for now; it will be updated to describe the
Rust build. gipfel.dat, AUTHORS, ChangeLog and NEWS are unchanged.
Diffstat (limited to 'tests/harness')
| -rw-r--r-- | tests/harness/build/cyl_funcs.cxx | 10 | ||||
| -rwxr-xr-x | tests/harness/build/exportdump | bin | 0 -> 403880 bytes | |||
| -rwxr-xr-x | tests/harness/build/fitdump | bin | 0 -> 252104 bytes | |||
| -rwxr-xr-x | tests/harness/build/funcsdump | bin | 0 -> 29832 bytes | |||
| -rw-r--r-- | tests/harness/build/rect_funcs.cxx | 16 | ||||
| -rwxr-xr-x | tests/harness/build/stitchdump | bin | 0 -> 276152 bytes | |||
| -rw-r--r-- | tests/harness/exportdump.cxx | 77 | ||||
| -rw-r--r-- | tests/harness/fitdump.cxx | 83 | ||||
| -rw-r--r-- | tests/harness/funcsdump.cxx | 60 | ||||
| -rw-r--r-- | tests/harness/stitchdump.cxx | 102 |
10 files changed, 348 insertions, 0 deletions
diff --git a/tests/harness/build/cyl_funcs.cxx b/tests/harness/build/cyl_funcs.cxx new file mode 100644 index 0000000..5143ba5 --- /dev/null +++ b/tests/harness/build/cyl_funcs.cxx @@ -0,0 +1,10 @@ +double cyl_mac_x ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 ; _1 = tan(c_nick) ; _2 = tan(m_nick) ; return (cos(c_tilt)*(m_view-c_view)-(sin(c_tilt)*(_2-_1))/(_1*_2+1))*scale ; } +double cyl_mac_y ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 ; _1 = tan(c_nick) ; _2 = tan(m_nick) ; return ((-sin(c_tilt)*(m_view-c_view))-(cos(c_tilt)*(_2-_1))/(_1*_2+1))*scale ; } +double cyl_mac_x_dc_view ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { return -cos(c_tilt)*scale ; } +double cyl_mac_x_dc_nick ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 ; _1 = pow(sec(c_nick),2) ; _2 = sin(c_tilt) ; _3 = tan(m_nick) ; _4 = tan(c_nick) ; _5 = _4*_3+1 ; return ((_1*_2*_3*(_3-_4))/pow(_5,2)+(_1*_2)/_5)*scale ; } +double cyl_mac_x_dc_tilt ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 ; _1 = tan(c_nick) ; _2 = tan(m_nick) ; return ((-sin(c_tilt)*(m_view-c_view))-(cos(c_tilt)*(_2-_1))/(_1*_2+1))*scale ; } +double cyl_mac_x_dscale ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 ; _1 = tan(c_nick) ; _2 = tan(m_nick) ; return cos(c_tilt)*(m_view-c_view)-(sin(c_tilt)*(_2-_1))/(_1*_2+1) ; } +double cyl_mac_y_dc_view ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { return sin(c_tilt)*scale ; } +double cyl_mac_y_dc_nick ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 ; _1 = pow(sec(c_nick),2) ; _2 = cos(c_tilt) ; _3 = tan(m_nick) ; _4 = tan(c_nick) ; _5 = _4*_3+1 ; return ((_1*_2*_3*(_3-_4))/pow(_5,2)+(_1*_2)/_5)*scale ; } +double cyl_mac_y_dc_tilt ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 ; _1 = tan(c_nick) ; _2 = tan(m_nick) ; return ((sin(c_tilt)*(_2-_1))/(_1*_2+1)-cos(c_tilt)*(m_view-c_view))*scale ; } +double cyl_mac_y_dscale ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 ; _1 = tan(c_nick) ; _2 = tan(m_nick) ; return (-sin(c_tilt)*(m_view-c_view))-(cos(c_tilt)*(_2-_1))/(_1*_2+1) ; } diff --git a/tests/harness/build/exportdump b/tests/harness/build/exportdump Binary files differnew file mode 100755 index 0000000..e732af7 --- /dev/null +++ b/tests/harness/build/exportdump diff --git a/tests/harness/build/fitdump b/tests/harness/build/fitdump Binary files differnew file mode 100755 index 0000000..37383c8 --- /dev/null +++ b/tests/harness/build/fitdump diff --git a/tests/harness/build/funcsdump b/tests/harness/build/funcsdump Binary files differnew file mode 100755 index 0000000..37efb59 --- /dev/null +++ b/tests/harness/build/funcsdump diff --git a/tests/harness/build/rect_funcs.cxx b/tests/harness/build/rect_funcs.cxx new file mode 100644 index 0000000..95c5cc2 --- /dev/null +++ b/tests/harness/build/rect_funcs.cxx @@ -0,0 +1,16 @@ +double rect_mac_x ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 ; _1 = sin(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = cos(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = x0+_13*_5*_14*_11+_1*_11*_12 ; _16 = pow(_15,2)+pow(_13*_11*_12-_1*_5*_14*_11,2) ; return scale*_15*(k0*sqrt(_16)+k1*_16+1) ; } +double rect_mac_y ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 ; _1 = cos(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = sin(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = _1*_11*_12-_13*_5*_14*_11 ; _16 = pow(x0+_1*_5*_14*_11+_13*_11*_12,2)+pow(_15,2) ; return _15*scale*(k0*sqrt(_16)+k1*_16+1) ; } +double rect_mac_x_dc_view ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 , _17 , _18 , _19 , _20 , _21 , _22 , _23 , _24 , _25 ; _1 = sin(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = _4*_5*_10+_2*_3 ; _12 = 1/_11 ; _13 = _2*_5*_10-_4*_3 ; _14 = cos(c_tilt) ; _15 = _6*_9-_8*_7 ; _16 = x0+_14*_5*_15*_12+_1*_12*_13 ; _17 = _14*_12*_13-_1*_5*_15*_12 ; _18 = 1/pow(_11,2) ; _19 = pow(_5,2) ; _20 = pow(_15,2) ; _21 = (-_8*_9)-_6*_7 ; _22 = _14*_5*_21*_12+_2*_1*_5*_15*_12-_4*_14*_19*_20*_18-_4*_1*_5*_15*_18*_13 ; _23 = 2*_22*_16+2*_17*((-_1*_5*_21*_12)+_2*_14*_5*_15*_12+_4*_1*_19*_20*_18-_4*_14*_5*_15*_18*_13) ; _24 = pow(_17,2)+pow(_16,2) ; _25 = sqrt(_24) ; return _22*scale*(k0*_25+k1*_24+1)+scale*_16*((k0*_23)/(2*_25)+k1*_23) ; } +double rect_mac_x_dc_nick ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 , _17 , _18 , _19 , _20 , _21 , _22 , _23 ; _1 = sin(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = _4*_5*_10+_2*_3 ; _12 = 1/_11 ; _13 = _2*_5*_10-_4*_3 ; _14 = cos(c_tilt) ; _15 = _6*_9-_8*_7 ; _16 = x0+_14*_5*_15*_12+_1*_12*_13 ; _17 = 1/pow(_11,2) ; _18 = _4*_3-_2*_5*_10 ; _19 = _14*_12*_13-_1*_5*_15*_12 ; _20 = (-_1*_17*_18*_13)-_14*_5*_15*_17*_18+_1 ; _21 = 2*_20*_16+2*((-_14*_17*_18*_13)+_1*_5*_15*_17*_18+_14)*_19 ; _22 = pow(_19,2)+pow(_16,2) ; _23 = sqrt(_22) ; return _20*scale*(k0*_23+k1*_22+1)+scale*_16*((k0*_21)/(2*_23)+k1*_21) ; } +double rect_mac_x_dc_tilt ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 , _17 , _18 , _19 ; _1 = sin(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = cos(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = x0+_13*_5*_14*_11+_1*_11*_12 ; _16 = _13*_11*_12-_1*_5*_14*_11 ; _17 = 2*_16*_15+2*((-_13*_5*_14*_11)-_1*_11*_12)*_16 ; _18 = pow(_16,2)+pow(_15,2) ; _19 = sqrt(_18) ; return _16*scale*(k0*_19+k1*_18+1)+scale*_15*((k0*_17)/(2*_19)+k1*_17) ; } +double rect_mac_x_dscale ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 ; _1 = sin(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = cos(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = x0+_13*_5*_14*_11+_1*_11*_12 ; _16 = pow(_15,2)+pow(_13*_11*_12-_1*_5*_14*_11,2) ; return _15*(k0*sqrt(_16)+k1*_16+1) ; } +double rect_mac_x_dk0 ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 ; _1 = sin(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = cos(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = x0+_13*_5*_14*_11+_1*_11*_12 ; return _15*sqrt(pow(_15,2)+pow(_13*_11*_12-_1*_5*_14*_11,2))*scale ; } +double rect_mac_x_dk1 ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 ; _1 = sin(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = cos(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = x0+_13*_5*_14*_11+_1*_11*_12 ; return _15*(pow(_15,2)+pow(_13*_11*_12-_1*_5*_14*_11,2))*scale ; } +double rect_mac_x_dx0 ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 , _17 ; _1 = sin(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = cos(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = x0+_13*_5*_14*_11+_1*_11*_12 ; _16 = pow(_15,2)+pow(_13*_11*_12-_1*_5*_14*_11,2) ; _17 = sqrt(_16) ; return scale*(k0*_17+k1*_16+1)+scale*_15*((k0*_15)/_17+2*k1*_15) ; } +double rect_mac_y_dc_view ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 , _17 , _18 , _19 , _20 , _21 , _22 , _23 , _24 , _25 ; _1 = cos(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = _4*_5*_10+_2*_3 ; _12 = 1/_11 ; _13 = _2*_5*_10-_4*_3 ; _14 = sin(c_tilt) ; _15 = _6*_9-_8*_7 ; _16 = _1*_12*_13-_14*_5*_15*_12 ; _17 = 1/pow(_11,2) ; _18 = pow(_5,2) ; _19 = pow(_15,2) ; _20 = (-_8*_9)-_6*_7 ; _21 = (-_14*_5*_20*_12)+_2*_1*_5*_15*_12+_4*_14*_18*_19*_17-_4*_1*_5*_15*_17*_13 ; _22 = x0+_1*_5*_15*_12+_14*_12*_13 ; _23 = 2*(_1*_5*_20*_12+_2*_14*_5*_15*_12-_4*_1*_18*_19*_17-_4*_14*_5*_15*_17*_13)*_22+2*_16*_21 ; _24 = pow(_22,2)+pow(_16,2) ; _25 = sqrt(_24) ; return _21*scale*(k0*_25+k1*_24+1)+_16*scale*((k0*_23)/(2*_25)+k1*_23) ; } +double rect_mac_y_dc_nick ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 , _17 , _18 , _19 , _20 , _21 , _22 , _23 ; _1 = cos(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = _4*_5*_10+_2*_3 ; _12 = 1/_11 ; _13 = _2*_5*_10-_4*_3 ; _14 = sin(c_tilt) ; _15 = _6*_9-_8*_7 ; _16 = _1*_12*_13-_14*_5*_15*_12 ; _17 = 1/pow(_11,2) ; _18 = _4*_3-_2*_5*_10 ; _19 = (-_1*_17*_18*_13)+_14*_5*_15*_17*_18+_1 ; _20 = x0+_1*_5*_15*_12+_14*_12*_13 ; _21 = 2*((-_14*_17*_18*_13)-_1*_5*_15*_17*_18+_14)*_20+2*_19*_16 ; _22 = pow(_20,2)+pow(_16,2) ; _23 = sqrt(_22) ; return _19*scale*(k0*_23+k1*_22+1)+_16*scale*((k0*_21)/(2*_23)+k1*_21) ; } +double rect_mac_y_dc_tilt ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 , _17 , _18 , _19 , _20 ; _1 = cos(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = sin(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = _1*_11*_12-_13*_5*_14*_11 ; _16 = (-_1*_5*_14*_11)-_13*_11*_12 ; _17 = x0+_1*_5*_14*_11+_13*_11*_12 ; _18 = 2*_15*_17+2*_16*_15 ; _19 = pow(_17,2)+pow(_15,2) ; _20 = sqrt(_19) ; return _16*scale*(k0*_20+k1*_19+1)+_15*scale*((k0*_18)/(2*_20)+k1*_18) ; } +double rect_mac_y_dscale ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 ; _1 = cos(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = sin(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = _1*_11*_12-_13*_5*_14*_11 ; _16 = pow(x0+_1*_5*_14*_11+_13*_11*_12,2)+pow(_15,2) ; return _15*(k0*sqrt(_16)+k1*_16+1) ; } +double rect_mac_y_dk0 ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 ; _1 = cos(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = sin(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = _1*_11*_12-_13*_5*_14*_11 ; return _15*scale*sqrt(pow(x0+_1*_5*_14*_11+_13*_11*_12,2)+pow(_15,2)) ; } +double rect_mac_y_dk1 ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 ; _1 = cos(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = sin(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = _1*_11*_12-_13*_5*_14*_11 ; return _15*scale*(pow(x0+_1*_5*_14*_11+_13*_11*_12,2)+pow(_15,2)) ; } +double rect_mac_y_dx0 ( double c_view, double c_nick, double c_tilt, double scale, double k0, double k1, double x0, double m_view, double m_nick ) { double _1 , _2 , _3 , _4 , _5 , _6 , _7 , _8 , _9 , _10 , _11 , _12 , _13 , _14 , _15 , _16 ; _1 = cos(c_tilt) ; _2 = sin(c_nick) ; _3 = sin(m_nick) ; _4 = cos(c_nick) ; _5 = cos(m_nick) ; _6 = cos(c_view) ; _7 = cos(m_view) ; _8 = sin(c_view) ; _9 = sin(m_view) ; _10 = _8*_9+_6*_7 ; _11 = 1/(_4*_5*_10+_2*_3) ; _12 = _2*_5*_10-_4*_3 ; _13 = sin(c_tilt) ; _14 = _6*_9-_8*_7 ; _15 = _1*_11*_12-_13*_5*_14*_11 ; _16 = x0+_1*_5*_14*_11+_13*_11*_12 ; return _15*((_16*k0)/sqrt(pow(_16,2)+pow(_15,2))+2*k1*_16)*scale ; } diff --git a/tests/harness/build/stitchdump b/tests/harness/build/stitchdump Binary files differnew file mode 100755 index 0000000..e63a628 --- /dev/null +++ b/tests/harness/build/stitchdump diff --git a/tests/harness/exportdump.cxx b/tests/harness/exportdump.cxx new file mode 100644 index 0000000..2c0e736 --- /dev/null +++ b/tests/harness/exportdump.cxx @@ -0,0 +1,77 @@ +// Golden dump: export-hills pipeline through the original C++ Panorama + +// ImageMetaData (mirrors GipfelWidget::load_image + export_hills, no FLTK). +// Usage: exportdump <img> <gipfel.dat> +#include <stdio.h> +#include <math.h> +#include <stdlib.h> +#include <exiv2/exiv2.hpp> + +#include "Panorama.H" +#include "Hill.H" +#include "ImageMetaData.H" + +int main(int argc, char **argv) { + if (argc < 3) { + fprintf(stderr, "usage: exportdump <img> <gipfel.dat>\n"); + return 1; + } + + int w = 0, h = 0; + { + auto im = Exiv2::ImageFactory::open(argv[1]); + im->readMetadata(); + w = im->pixelWidth(); + h = im->pixelHeight(); + } + + ImageMetaData md; + md.load_image(argv[1]); + + Panorama pan; + pan.set_view_long(md.longitude()); + pan.set_view_lat(md.latitude()); + pan.set_view_height(md.height()); + pan.set_projection((ProjectionLSQ::Projection_t) md.projection_type()); + + int have = 1; + double v; + v = md.direction(); + if (std::isnan(v)) { pan.set_center_angle(0.0); have = 0; } else pan.set_center_angle(v); + v = md.nick(); + if (std::isnan(v)) { pan.set_nick_angle(0.0); have = 0; } else pan.set_nick_angle(v); + v = md.tilt(); + if (std::isnan(v)) { pan.set_tilt_angle(0.0); have = 0; } else pan.set_tilt_angle(v); + v = md.focal_length_35mm(); + if (std::isnan(v) || v == 0.0) { pan.set_scale(35.0 * (double)(w > h ? w : h) / 35.0); have = 0; } + else pan.set_scale(v * (double)(w > h ? w : h) / 35.0); + + md.distortion_params(&pan.parms.k0, &pan.parms.k1, &pan.parms.x0); + if (std::isnan(pan.parms.k0)) pan.parms.k0 = 0.0; + if (std::isnan(pan.parms.k1)) pan.parms.k1 = 0.0; + if (std::isnan(pan.parms.x0)) pan.parms.x0 = 0.0; + + if (pan.load_data(argv[2])) return 1; + pan.set_height_dist_ratio(0.07); + + if (!have) { + fprintf(stderr, "No gipfel info available.\n"); + return 0; + } + + printf("#\n# name\theight\tx\ty\tdistance\tflags\n#\n"); + Hills *mnts = pan.get_visible_mountains(); + for (int i = 0; i < mnts->get_num(); i++) { + Hill *m = mnts->get(i); + int _x = (int) rint(m->x) + w / 2; + int _y = (int) rint(m->y) + h / 2; + + if (m->flags & Hill::DUPLIC || m->flags & Hill::HIDDEN) + continue; + if (_x < 0 || _x > w || _y < 0 || _y > h) + continue; + + printf("%s\t%d\t%d\t%d\t%d\n", m->name, (int) rint(m->height), _x, _y, + (int) rint(pan.get_real_distance(m))); + } + return 0; +} diff --git a/tests/harness/fitdump.cxx b/tests/harness/fitdump.cxx new file mode 100644 index 0000000..8ef392c --- /dev/null +++ b/tests/harness/fitdump.cxx @@ -0,0 +1,83 @@ +// Golden dump: full fit through the original C++ Panorama + GSL solver. +// Usage: fitdump <gipfel.dat> <projection 0|1> +#include <stdio.h> +#include <math.h> +#include <stdlib.h> + +#include "Panorama.H" +#include "Hill.H" +#include "ProjectionRectilinear.H" +#include "ProjectionCylindrical.H" + +int main(int argc, char **argv) { + if (argc < 3) { + fprintf(stderr, "usage: fitdump <gipfel.dat> <projection>\n"); + return 1; + } + + Panorama pan; + if (pan.load_data(argv[1])) { + fprintf(stderr, "load failed\n"); + return 1; + } + pan.set_projection((ProjectionLSQ::Projection_t) atoi(argv[2])); + + pan.set_view_lat(47.36); + pan.set_view_long(11.15); + pan.set_view_height(2100.0); + + // ground truth + pan.set_center_angle(20.0); + pan.set_nick_angle(0.0); + pan.set_tilt_angle(1.0); + pan.set_scale(3000.0); + + // observed positions = projection of first 6 visible hills (snapshotted + // as copies so the perturbation below does not overwrite them) + Hills *vis = pan.get_visible_mountains(); + Hills known; + int n = vis->get_num() < 6 ? vis->get_num() : 6; + for (int i = 0; i < n; i++) { + Hill *c = new Hill(*vis->get(i)); + // NOTE: Hill's copy ctor in the original does not copy a_nick + // (uninitialized garbage -> LSQR stagnates). The real app always + // fits hills living in the main list where a_nick is set, so set it + // here to reproduce the real-app behavior. + c->a_nick = vis->get(i)->a_nick; + known.add(c); + } + + // perturb the initial guess + pan.set_center_angle(pan.get_center_angle() + 0.5); + pan.set_nick_angle(0.3); + pan.set_tilt_angle(0.5); + pan.set_scale(2800.0); + + int ret = pan.comp_params(&known); + + ViewParams *p = &pan.parms; + printf("ret %d\n", ret); + printf("a_center %.17g\n", p->a_center); + printf("a_nick %.17g\n", p->a_nick); + printf("a_tilt %.17g\n", p->a_tilt); + printf("scale %.17g\n", p->scale); + printf("k0 %.17g\n", p->k0); + printf("k1 %.17g\n", p->k1); + printf("x0 %.17g\n", p->x0); + + // final image coordinates of the known hills (bypass visibility check) + for (int i = 0; i < known.get_num(); i++) { + Hill *m = known.get(i); + double x = NAN, y = NAN; + if (atoi(argv[2]) == 1) { + ProjectionCylindrical pc; + pc.get_coordinates(m->alph, m->a_nick, &pan.parms, &x, &y); + } else { + ProjectionRectilinear pr; + pr.get_coordinates(m->alph, m->a_nick, &pan.parms, &x, &y); + } + printf("hill %d %.17g %.17g\n", i, x, y); + } + + return 0; +} diff --git a/tests/harness/funcsdump.cxx b/tests/harness/funcsdump.cxx new file mode 100644 index 0000000..b416f2c --- /dev/null +++ b/tests/harness/funcsdump.cxx @@ -0,0 +1,60 @@ +// Golden dump of the maxima-generated projection functions (C reference). +// The `#define` trick turns the generated class methods into free functions. +#include <stdio.h> +#include <math.h> + +static double sec(double a) { return 1.0 / cos(a); } + +// gen_golden.sh copies the generated files with the class scope replaced: +// ProjectionRectilinear::rect_mac_x -> rect_mac_x, ProjectionCylindrical::rect_mac_x -> cyl_mac_x +#include "rect_funcs.cxx" +#include "cyl_funcs.cxx" + +int main(void) { + for (int k = 0; k < 200; k++) { + double kk = (double) k; + double c_view = -3.0 + 0.03 * kk; + double c_nick = 0.10 * sin(0.11 * kk); + double c_tilt = 0.05 * cos(0.07 * kk); + double scale = 2000.0 + 37.0 * fmod(kk, 19.0); + double k0 = 0.001 * sin(0.31 * kk); + double k1 = 0.0001 * cos(0.17 * kk); + double x0 = 50.0 * sin(0.13 * kk); + double m_view = c_view + 0.5 * sin(0.23 * kk); + double m_nick = 0.05 * cos(0.19 * kk); + + printf("%.17g %.17g %.17g %.17g %.17g %.17g %.17g %.17g %.17g ", + rect_mac_x(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_y(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_x_dc_view(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_x_dc_nick(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_x_dc_tilt(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_x_dscale(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_x_dk0(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_x_dk1(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_x_dx0(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick)); + printf("%.17g %.17g %.17g %.17g %.17g %.17g %.17g ", + rect_mac_y_dc_view(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_y_dc_nick(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_y_dc_tilt(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_y_dscale(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_y_dk0(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_y_dk1(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + rect_mac_y_dx0(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick)); + + printf("%.17g %.17g ", + cyl_mac_x(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + cyl_mac_y(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick)); + printf("%.17g %.17g %.17g %.17g ", + cyl_mac_x_dc_view(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + cyl_mac_x_dc_nick(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + cyl_mac_x_dc_tilt(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + cyl_mac_x_dscale(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick)); + printf("%.17g %.17g %.17g %.17g\n", + cyl_mac_y_dc_view(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + cyl_mac_y_dc_nick(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + cyl_mac_y_dc_tilt(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick), + cyl_mac_y_dscale(c_view, c_nick, c_tilt, scale, k0, k1, x0, m_view, m_nick)); + } + return 0; +} diff --git a/tests/harness/stitchdump.cxx b/tests/harness/stitchdump.cxx new file mode 100644 index 0000000..cd015e7 --- /dev/null +++ b/tests/harness/stitchdump.cxx @@ -0,0 +1,102 @@ +// Golden dump: Stitch::resample pipeline through the original C++ Panorama + +// ScanImage (no FLTK GUI; PPM input wrapped in Fl_RGB_Image). +// Usage: stitchdump <img.ppm> <projtype> <center> <pitch> <roll> <scale> +// <k0> <k1> <x0> <w> <h> <from> <to> <bicubic> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include <ctype.h> +#include <algorithm> + +#include <FL/Fl.H> +#include <FL/Fl_RGB_Image.H> + +#include "Panorama.H" +#include "ScanImage.H" + +#define MAX_VALUE 65025 + +// minimal P6 PPM reader +static unsigned char *read_ppm(const char *path, int *w, int *h) { + FILE *f = fopen(path, "rb"); + if (!f) return NULL; + int c; + if (fgetc(f) != 'P' || fgetc(f) != '6' || (c = fgetc(f), !isspace(c))) { + fclose(f); return NULL; + } + int skip = 0; + while (!skip) { + c = fgetc(f); + if (c == '#') { while ((c = fgetc(f)) != '\n' && c != EOF); continue; } + if (c == ' ' || c == '\n' || c == '\t' || c == '\r') continue; + skip = 1; + ungetc(c, f); + } + (void)c; + if (fscanf(f, "%d %d %*d", w, h) != 2) { fclose(f); return NULL; } + fgetc(f); // single whitespace + unsigned char *buf = (unsigned char*)malloc((size_t)(*w) * (*h) * 3); + if (fread(buf, 1, (size_t)(*w) * (*h) * 3, f) != (size_t)(*w) * (*h) * 3) { + free(buf); fclose(f); return NULL; + } + fclose(f); + return buf; +} + +int main(int argc, char **argv) { + if (argc < 15) { + fprintf(stderr, "usage: stitchdump <img.ppm> <projtype> <center> <pitch> " + "<roll> <scale> <k0> <k1> <x0> <w> <h> <from> <to> <bicubic>\n"); + return 1; + } + int iw = 0, ih = 0; + unsigned char *px = read_ppm(argv[1], &iw, &ih); + if (!px) { fprintf(stderr, "cannot read %s\n", argv[1]); return 1; } + + Fl_RGB_Image img(px, iw, ih, 3); + + Panorama pan; + pan.set_projection((ProjectionLSQ::Projection_t) atoi(argv[2])); + pan.set_center_angle(atof(argv[3])); + pan.set_nick_angle(atof(argv[4])); + pan.set_tilt_angle(atof(argv[5])); + pan.set_scale(atof(argv[6])); + pan.parms.k0 = atof(argv[7]); + pan.parms.k1 = atof(argv[8]); + pan.parms.x0 = atof(argv[9]); + + int w = atoi(argv[10]), h = atoi(argv[11]); + double view_start = atof(argv[12]) * M_PI / 180.0; + double view_end = atof(argv[13]) * M_PI / 180.0; + ScanImage::mode_t mode = atoi(argv[14]) ? ScanImage::BICUBIC : ScanImage::NEAREST; + + double step_view = (view_end - view_start) / w; + int y_off = h / 2; + double radius = (double) w / (view_end - view_start); + + for (int y = 0; y < h; y++) { + double a_nick = atan((double)(y_off - y) / radius); + for (int x = 0; x < w; x++) { + double a_view = view_start + x * step_view; + int hit = 0, r = 0, g = 0, b = 0; + double px2, py2; + if (pan.get_coordinates(a_view, a_nick, &px2, &py2) == 0) { + int rr, gg, bb; + if (ScanImage::get_pixel(&img, mode, + px2 + ((double) img.w()) / 2.0, + py2 + ((double) img.h()) / 2.0, + &rr, &gg, &bb) == 0) { + hit = 1; + r = std::max(std::min(rr, MAX_VALUE), 0); + g = std::max(std::min(gg, MAX_VALUE), 0); + b = std::max(std::min(bb, MAX_VALUE), 0); + } + } + printf("%d %d %d %d %d %d\n", x, y, hit, r, g, b); + } + } + + free(px); + return 0; +} |
