Вращающаяся тестовая перегрузка оператора - PullRequest
0 голосов
/ 06 февраля 2019

моя функция теста поворота не соответствует школьной.Пожалуйста, просветите меня, где я ошибся.Я пытался решить это так долго, но безрезультатно.Спасибо!

********** мой тест поворота **********

Точка (-50.000, -50.000) повернута на 45.000 градусов (0.000,0.000)

Точка (-6.000, -6.000) повернута на 45.000 градусов (0.000,0.000)

********** Тест школы Rotate **********

Точка (-50.000, -50.000) повернута на 45.000 градусов (0.000, -70.711)

Точка (-6.000, -6.000) повернута на 45.000 градусов (0.000, -8,485)

Функция проверки поворота:

   Point Point::operator%( double angle)
{
    Point p;
    double rad=angle * PI / 180.0;
    double s = sin(rad);
    double c = cos(rad);


    // rotate point
    double xnew = p.x * c - p.y * s;
    double ynew = p.x * s + p.y * c;

    p.x = xnew;
    p.y = ynew;
    return p;
    // return Point(cos(degree) * (p.x) - sin(degree) * (p.y),
              // sin(degree) * (p.x) - cos(degree) * (p.y));

    // return p;
}

Файл драйвера:

 void RotateTest(void)
{
cout << "\n********** Rotate test ********** " << endl;

Point pt1(-50, -50);
double angle = 45;

Point pt2 = pt1 % angle;

cout.setf(std::ios_base::fixed, std::ios::floatfield);
std::cout.precision(3);
cout << "Point " << pt1 << " rotated " << angle << " degrees is " << 
    pt2 << endl;

pt1 = Point(-6, -6);
angle = 45;

pt2 = pt1 % angle;
cout << "Point " << pt1 << " rotated " << angle << " degrees is " << 
    pt2 << endl;

cout << endl;
cout.unsetf(std::ios_base::fixed);
std::cout.precision(6);
 } 

list.h Файл:

 class Point
  {
    public:
  // Point(double X, double Y);    // Constructors (2)
  explicit Point(double x, double y); 

  Point();

   double getX() const;

   double getY() const;

   Point operator+(const Point& other)const ;

   Point& operator+(double val)  ;


   Point operator*(double value) ;

   Point operator%(double angle);


   double operator-(const Point& other)const ;

   Point operator-(double val);

   Point operator^(const Point& other);

   Point& operator+=(double val);
   Point& operator+=(const Point& other) ;

   Point& operator++();
   Point operator++(int); 

   Point& operator--(); 
   Point operator--(int); 

   Point operator-() const;


        // Overloaded operators (14 member functions)
   friend std::ostream &operator<<( std::ostream &output, const Point 
  &point );
    friend std::istream &operator>>( std::istream  &input, Point 
  &point );

    // Overloaded operators (2 friend functions)

  private:
  double x; // The x-coordinate of a Point
  double y; // The y-coordinate of a Point

    // Helper functions
  double DegreesToRadians(double degrees) const;
  double RadiansToDegrees(double radians) const;
  };

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема, которую я вижу из вашего опубликованного кода, заключается в том, что вы используете локальную точку функции p для вычисления преобразованной точки.Предположительно, это инициализируется в (0, 0).Вращение этой точки не меняет ее местоположение.Вам нужно использовать this.

Point Point::operator%( double angle)
{
    Point p;
    double rad=angle * PI / 180.0;
    double s = sin(rad);
    double c = cos(rad);

    // rotate point
    double xnew = this->x * c - this->y * s;
    double ynew = this->x * s + this->y * c;

    p.x = xnew;
    p.y = ynew;
    return p;
}

или упрощенную версию:

Point Point::operator%( double angle)
{
    double rad=angle * PI / 180.0;
    double s = sin(rad);
    double c = cos(rad);

    // rotate point
    return Point(this->x * c - this->y * s,
                 this->x * s + this->y * c);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...