Factorize rotated point computation

master
Fabien Freling 2014-07-03 23:54:06 +02:00
parent a871d92723
commit 8811d7023e
1 changed files with 10 additions and 5 deletions

View File

@ -627,8 +627,6 @@ Image* rotate(Image const& src, double angle)
src_delta_y.y = src_delta_y.y - src_origin.y;
round_if_very_small(src_delta_y.x);
round_if_very_small(src_delta_y.y);
// cout << "src delta x = " << src_delta_x << endl;
// cout << "src delta y = " << src_delta_y << endl;
// // steps for first column in source image (y)
@ -637,10 +635,10 @@ Image* rotate(Image const& src, double angle)
int line_nb_steps = max(abs(tr.x - tl.x), abs(tr.y - tl.y));
// steps for first column in rotated image (y)
DPoint rotated_step((bl.x - tl.x) / (float) origin_nb_steps, (bl.y - tl.y) / (float) origin_nb_steps);
DPoint const rotated_step((bl.x - tl.x) / (float) origin_nb_steps, (bl.y - tl.y) / (float) origin_nb_steps);
// steps for line in rotated image (x)
DPoint bresenham((tr.x - tl.x) / (float) line_nb_steps, (tr.y - tl.y) / (float) line_nb_steps);
DPoint const bresenham((tr.x - tl.x) / (float) line_nb_steps, (tr.y - tl.y) / (float) line_nb_steps);
unsigned int const src_limit = src.width * src.height * 3;
unsigned int const rot_limit = rotated->width * rotated->height * 3;
@ -649,12 +647,13 @@ Image* rotate(Image const& src, double angle)
{
// first column origin
Point const rot_origin(tl.x + y_i * rotated_step.x, tl.y + y_i * rotated_step.y);
Point rot_point(rot_origin.x, rot_origin.y);
DPoint rot_delta(0.0, 0.0);
Point previous = rot_origin;
for (int x_i = 0; x_i <= (int) line_nb_steps; ++x_i)
{
Point rot_point(rot_origin.x + x_i * bresenham.x, rot_origin.y + x_i * bresenham.y);
Point const delta(rot_point.x - tl.x, rot_point.y - tl.y);
DPoint src_rotated_point(src_tl.x + delta.x * src_delta_x.x + delta.y * src_delta_y.x,
@ -677,6 +676,12 @@ Image* rotate(Image const& src, double angle)
}
previous = rot_point;
rot_delta.x += bresenham.x;
rot_point.x = rot_origin.x + (int) rot_delta.x;
rot_delta.y += bresenham.y;
rot_point.y = rot_origin.y + (int) rot_delta.y;
}
}