Added optimized methods for point and polyline rotation.
Existing methods for rotation were optimized by calculating the sin/cos values once only. Added an operator- for points.
This commit is contained in:
parent
c8ff517389
commit
7d54e28e30
4 changed files with 54 additions and 4 deletions
|
@ -30,6 +30,20 @@ MultiPoint::translate(const Point &vector)
|
||||||
this->translate(vector.x, vector.y);
|
this->translate(vector.x, vector.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MultiPoint::rotate(double angle)
|
||||||
|
{
|
||||||
|
double s = sin(angle);
|
||||||
|
double c = cos(angle);
|
||||||
|
for (Points::iterator it = points.begin(); it != points.end(); ++it) {
|
||||||
|
(*it).rotate(angle);
|
||||||
|
double cur_x = (double)it->x;
|
||||||
|
double cur_y = (double)it->y;
|
||||||
|
it->x = (coord_t)round(c * cur_x - s * cur_y);
|
||||||
|
it->y = (coord_t)round(c * cur_y + s * cur_x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MultiPoint::rotate(double angle, const Point ¢er)
|
MultiPoint::rotate(double angle, const Point ¢er)
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,6 +22,7 @@ class MultiPoint
|
||||||
void scale(double factor);
|
void scale(double factor);
|
||||||
void translate(double x, double y);
|
void translate(double x, double y);
|
||||||
void translate(const Point &vector);
|
void translate(const Point &vector);
|
||||||
|
void rotate(double angle);
|
||||||
void rotate(double angle, const Point ¢er);
|
void rotate(double angle, const Point ¢er);
|
||||||
void reverse();
|
void reverse();
|
||||||
Point first_point() const;
|
Point first_point() const;
|
||||||
|
|
|
@ -46,13 +46,26 @@ Point::translate(const Vector &vector)
|
||||||
this->translate(vector.x, vector.y);
|
this->translate(vector.x, vector.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Point::rotate(double angle)
|
||||||
|
{
|
||||||
|
double cur_x = (double)this->x;
|
||||||
|
double cur_y = (double)this->y;
|
||||||
|
double s = sin(angle);
|
||||||
|
double c = cos(angle);
|
||||||
|
this->x = (coord_t)round(c * cur_x - s * cur_y);
|
||||||
|
this->y = (coord_t)round(c * cur_y + s * cur_x);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Point::rotate(double angle, const Point ¢er)
|
Point::rotate(double angle, const Point ¢er)
|
||||||
{
|
{
|
||||||
double cur_x = (double)this->x;
|
double cur_x = (double)this->x;
|
||||||
double cur_y = (double)this->y;
|
double cur_y = (double)this->y;
|
||||||
this->x = (coord_t)round( (double)center.x + cos(angle) * (cur_x - (double)center.x) - sin(angle) * (cur_y - (double)center.y) );
|
double s = sin(angle);
|
||||||
this->y = (coord_t)round( (double)center.y + cos(angle) * (cur_y - (double)center.y) + sin(angle) * (cur_x - (double)center.x) );
|
double c = cos(angle);
|
||||||
|
this->x = (coord_t)round( (double)center.x + c * (cur_x - (double)center.x) - s * (cur_y - (double)center.y) );
|
||||||
|
this->y = (coord_t)round( (double)center.y + c * (cur_y - (double)center.y) + s * (cur_x - (double)center.x) );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -293,6 +306,12 @@ operator+(const Point& point1, const Point& point2)
|
||||||
return Point(point1.x + point2.x, point1.y + point2.y);
|
return Point(point1.x + point2.x, point1.y + point2.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Point
|
||||||
|
operator-(const Point& point1, const Point& point2)
|
||||||
|
{
|
||||||
|
return Point(point1.x - point2.x, point1.y - point2.y);
|
||||||
|
}
|
||||||
|
|
||||||
Point
|
Point
|
||||||
operator*(double scalar, const Point& point2)
|
operator*(double scalar, const Point& point2)
|
||||||
{
|
{
|
||||||
|
@ -333,13 +352,26 @@ Pointf::translate(const Vectorf &vector)
|
||||||
this->translate(vector.x, vector.y);
|
this->translate(vector.x, vector.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Pointf::rotate(double angle)
|
||||||
|
{
|
||||||
|
double cur_x = this->x;
|
||||||
|
double cur_y = this->y;
|
||||||
|
double s = sin(angle);
|
||||||
|
double c = cos(angle);
|
||||||
|
this->x = c * cur_x - s * cur_y;
|
||||||
|
this->y = c * cur_y + s * cur_x;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Pointf::rotate(double angle, const Pointf ¢er)
|
Pointf::rotate(double angle, const Pointf ¢er)
|
||||||
{
|
{
|
||||||
double cur_x = this->x;
|
double cur_x = this->x;
|
||||||
double cur_y = this->y;
|
double cur_y = this->y;
|
||||||
this->x = center.x + cos(angle) * (cur_x - center.x) - sin(angle) * (cur_y - center.y);
|
double s = sin(angle);
|
||||||
this->y = center.y + cos(angle) * (cur_y - center.y) + sin(angle) * (cur_x - center.x);
|
double c = cos(angle);
|
||||||
|
this->x = center.x + c * (cur_x - center.x) - s * (cur_y - center.y);
|
||||||
|
this->y = center.y + c * (cur_y - center.y) + s * (cur_x - center.x);
|
||||||
}
|
}
|
||||||
|
|
||||||
Pointf
|
Pointf
|
||||||
|
|
|
@ -41,6 +41,7 @@ class Point
|
||||||
void scale(double factor);
|
void scale(double factor);
|
||||||
void translate(double x, double y);
|
void translate(double x, double y);
|
||||||
void translate(const Vector &vector);
|
void translate(const Vector &vector);
|
||||||
|
void rotate(double angle);
|
||||||
void rotate(double angle, const Point ¢er);
|
void rotate(double angle, const Point ¢er);
|
||||||
bool coincides_with(const Point &point) const;
|
bool coincides_with(const Point &point) const;
|
||||||
bool coincides_with_epsilon(const Point &point) const;
|
bool coincides_with_epsilon(const Point &point) const;
|
||||||
|
@ -63,6 +64,7 @@ class Point
|
||||||
};
|
};
|
||||||
|
|
||||||
Point operator+(const Point& point1, const Point& point2);
|
Point operator+(const Point& point1, const Point& point2);
|
||||||
|
Point operator-(const Point& point1, const Point& point2);
|
||||||
Point operator*(double scalar, const Point& point2);
|
Point operator*(double scalar, const Point& point2);
|
||||||
|
|
||||||
class Point3 : public Point
|
class Point3 : public Point
|
||||||
|
@ -90,6 +92,7 @@ class Pointf
|
||||||
void scale(double factor);
|
void scale(double factor);
|
||||||
void translate(double x, double y);
|
void translate(double x, double y);
|
||||||
void translate(const Vectorf &vector);
|
void translate(const Vectorf &vector);
|
||||||
|
void rotate(double angle);
|
||||||
void rotate(double angle, const Pointf ¢er);
|
void rotate(double angle, const Pointf ¢er);
|
||||||
Pointf negative() const;
|
Pointf negative() const;
|
||||||
Vectorf vector_to(const Pointf &point) const;
|
Vectorf vector_to(const Pointf &point) const;
|
||||||
|
|
Loading…
Reference in a new issue