@@ -609,7 +609,7 @@ DeWarping(Canvas *canvas, QStatusBar *statusbar, int count) : QObject(canvas),
609609 lnd << QPointF (pixmap.width (), 0 );
610610 lndt << QPointF (pixmap.width (), 0 );
611611 // add buttons
612- LagrangeCheck = new QCheckBox (" Lagrange ?" , statusbar);
612+ LagrangeCheck = new QCheckBox (" Akima ?" , statusbar);
613613 statusbar->addPermanentWidget (LagrangeCheck);
614614 EqualAreaCheck = new QCheckBox (" Equal Area?" , statusbar);
615615 statusbar->addPermanentWidget (EqualAreaCheck);
@@ -746,9 +746,10 @@ DeWarping:: EqualAreaMode()
746746void
747747DeWarping:: transform()
748748{
749- int i, n, y, x, w, h, ih, id, ic;
749+ int i, n, y, x, w, h, ih, id;
750+ // int ic; // InterpolateLagrangePolynomial
750751 float yh, yd, dyh, dyd, yk0, yk1, yk2, oy;
751- QPolygonF lni;
752+ // QPolygonF lni; // InterpolateLagrangePolynomial
752753 n = lnh.count ();
753754 if (n > 4 )
754755 {
@@ -780,6 +781,7 @@ DeWarping:: transform()
780781 }
781782 if (flagrange)
782783 {
784+ /* // InterpolateLagrangePolynomial
783785 lni.clear();
784786 ic = (ih < 3) ? 3 : (ih > n - 3) ? (n - 3) : ih;
785787 for (i = ic - 2; i < ic + 2; i++)
@@ -792,21 +794,17 @@ DeWarping:: transform()
792794 yd = InterpolateLagrangePolynomial (x, lni);
793795 yh = (yh < 1.0f) ? 1.0f : ((yh < h - 1) ? yh : (h - 1));
794796 yd = (yd < 1.0f) ? 1.0f : ((yd < h - 1) ? yd : (h - 1));
797+ */
798+ yh = InterpolateAkima (x, lnh);
799+ yd = InterpolateAkima (x, lnd);
800+ yh = (yh < 1 .0f ) ? 1 .0f : ((yh < h - 1 ) ? yh : (h - 1 ));
801+ yd = (yd < 1 .0f ) ? 1 .0f : ((yd < h - 1 ) ? yd : (h - 1 ));
795802 }
796803 else
797804 {
798805 yh = (float )lnh[ih - 1 ].y () + dyh * (x - lnh[ih - 1 ].x ());
799806 yd = (float )lnd[id - 1 ].y () + dyd * (x - lnd[id - 1 ].x ());
800807 }
801- /*
802- if (yh < yd)
803- {
804- yh += yd;
805- yh *= 0.5f;
806- yh += 0.5f;
807- yd = yh - 1.0f;
808- }
809- */
810808 yk0 = yd / ylnd;
811809 yk1 = (yh - yd) / (ylnh - ylnd);
812810 yk2 = (h - yh) / (h - ylnh);
@@ -1123,6 +1121,73 @@ float InterpolateLagrangePolynomial (float x, QPolygonF p)
11231121 return lagrange_pol;
11241122}
11251123
1124+ float InterpolateAkima (float x, QPolygonF p)
1125+ {
1126+ int i, k, l, n = p.count ();
1127+ float xt, dx, dy, a, b, fx, val, m[5 ], t[2 ];
1128+
1129+ k = 0 ;
1130+ dx = (p[n - 1 ].x () - p[0 ].x ()) / n;
1131+ for (i = 1 ; i < (n - 1 ); i++)
1132+ {
1133+ xt = p[i].x ();
1134+ k = (xt < x) ? i : k;
1135+ }
1136+ if (k < 2 )
1137+ {
1138+ for (i = (2 - k); i < 5 ; i++)
1139+ {
1140+ l = k + i - 2 ;
1141+ dx = p[l + 1 ].x () - p[l].x ();
1142+ dy = p[l + 1 ].y () - p[l].y ();
1143+ m[i] = (dx > 0 .0f ) ? (dy / dx) : 0 .0f ;
1144+ }
1145+ for (i = (1 - k); i >= 0 ; i--)
1146+ {
1147+ m[i] = 2 .0f * m[i + 1 ] - m[i + 2 ];
1148+ }
1149+ }
1150+ else
1151+ {
1152+ if (k > (n - 4 ))
1153+ {
1154+ for (i = 0 ; i < (n - k + 1 ); i++)
1155+ {
1156+ l = k + i - 2 ;
1157+ dx = p[l + 1 ].x () - p[l].x ();
1158+ dy = p[l + 1 ].y () - p[l].y ();
1159+ m[i] = (dx > 0 .0f ) ? (dy / dx) : 0 .0f ;
1160+ }
1161+ for (i = (n - k + 1 ); i < 5 ; i++)
1162+ {
1163+ m[i] = 2 .0f * m[i - 1 ] - m[i - 2 ];
1164+ }
1165+ }
1166+ else
1167+ {
1168+ for (i = 0 ; i < 5 ; i++)
1169+ {
1170+ l = k + i - 2 ;
1171+ dx = p[l + 1 ].x () - p[l].x ();
1172+ dy = p[l + 1 ].y () - p[l].y ();
1173+ m[i] = (dx > 0 .0f ) ? (dy / dx) : 0 .0f ;
1174+ }
1175+ }
1176+ }
1177+ for (i = 0 ; i < 2 ; i++)
1178+ {
1179+ a = (m[i + 2 ] > m[i + 3 ]) ? (m[i + 2 ] - m[i + 3 ]) : (m[i + 3 ] - m[i + 2 ]);
1180+ b = (m[i] > m[i + 1 ]) ? (m[i] - m[i + 1 ]) : (m[i + 1 ] - m[i]);
1181+ t[i] = ((a + b) > 0 ) ? ((a * m[i + 1 ] + b * m[i + 2 ]) / (a + b)) : (0 .5f * (m[i + 1 ] + m[i + 2 ]));
1182+ }
1183+ dx = x - p[k].x ();
1184+ dy = p[k + 1 ].x () - p[k].x ();
1185+ fx = (dy > 0 .0f ) ? (dx / dy) : 0 .0f ;
1186+ val = p[k].y () + t[0 ] * dx + (3 .0f * m[2 ] - 2 .0f * t[0 ] - t[1 ]) * dx * fx + (t[0 ] + t[1 ] - 2 .0f * m[2 ]) * dx * fx * fx;
1187+
1188+ return val;
1189+ }
1190+
11261191QRgb InterpolateBiCubic (QImage img, float y, float x)
11271192{
11281193 int i, d, dn, xi, yi, xf, yf;
0 commit comments