Преобразование координат в c

#c #coordinates #coordinate-transformation #polar-coordinates

#c #координаты #преобразование координат #полярные координаты

Вопрос:

Я пытаюсь преобразовать разные системы координат. Из полярного в прямоугольный и наоборот. Моя pol_to_rect() функция не работает должным образом. Оно выдает очень маленькие значения (~ 10 ^ (-44)) после преобразования, а также перед преобразованием. При использовании функций sin() и cos() могут возникнуть некоторые проблемы. rect_to_pol() При положительных значениях работает нормально. Редактировать — Когда я изменил atan() на atan2() , как я могу включить другие значения x и y.

 #include <iostream>
#include <cmath>

using namespace std;
#define PI 3.1415926
class Polar; // Forward declaration

class Rectangular {
    private:
        float x, y;

    public:
        Rectangular() {} // default constructor
        Rectangular(float mv_x, float mv_y) {
            x = mv_x;
            y = mv_y;
        }

        void showData() const;
        Polar rect_to_pol();
        floatamp; get_x() {
            return x;
        }

        floatamp; get_y() {
            return y;
        }

};

void Rectangular::showData() const {
    cout << "--Rectangular--" << endl;
    cout << "x: " << x << "t" <<"y: " << y << endl;
}




class Polar {
    private:
        float r;
        float theta;
    public:
        Polar() {} // default constructor
        Polar(float mv_r, float mv_theta) {
            r = mv_r;
            theta = mv_theta;
        }
        void showData();
        Rectangular pol_to_rect();
        floatamp; get_r(){
            return r;
        }
        floatamp; get_theta() {
            return theta;
        }

};

void Polar::showData() {
    cout << "--Polar--" << endl;
    cout << "r:" << r << "t" << "Theta(Radians):" << theta << endl;
}

Rectangular Polar::pol_to_rect() {
    Rectangular temp;
    temp.get_x() = r * cos(theta*(PI/180.0)); // in degrees
    temp.get_y() = r * sin(theta*(PI/180.0));
    return temp;

}

Polar Rectangular::rect_to_pol() {
    Polar temp;

    temp.get_r() = sqrt(pow(x, 2)   pow(y, 2));
    temp.get_theta() = atan2(y, x);
    return temp;
}

int main()
{
    Rectangular r1(-1, -1), r2;
    Polar p1(12.0, 30.0), p2;
    r1.showData();
    p2 = r1.rect_to_pol();
    cout << "After Conversion (RECT TO POLAR)->" << endl;
    p2.showData();

    p1.showData();
    r2 = p1.pol_to_rect();
    cout << "After Conversion (POLAR TO RECT)" << endl;
    r2.showData();
    return 0;
}
  

Комментарии:

1.Затенение переменной в Polar(float r, float theta) { r = r; theta = theta; } r = r — это самостоятельное присвоение параметра, оставляющее элемент r неизменным. Используйте список инициализаторов элементов: Polar(float r, float theta): r(r), theta(theta) { }

2. Знаете ли вы о atan2() ? Я весьма удивлен, что вы описываете rect_to_pol() как нормально работающий.

3. Я понимаю другие комментарии о том, что проблема заключается в том, r=r; что вы, похоже, имеете в виду два разных, но с одинаковыми именами r . Я рекомендую выработать другую привычку и использовать более длинные, более явные идентификаторы. Даже если r это очевидно для radius, я бы не доверял себе надежно отслеживать, что r где подразумевается. Например. Я склонен использовать шаблон именования для параметров конструкторов, которые используются для инициализации переменных-членов ( mv ), подобных mvInit , а затем выполняемых ...:mv(mvInit){... .

4. Rect_to_pol возвращает угол в радианах, pol_to_rect предполагает, что угол выражен в градусах. Это непоследовательно. Также число PI должно содержать еще несколько цифр.

5. Пара координат должна быть неизменяемой. Вы создаете его из двух чисел, и оно остается неизменным, пока не умрет. Если вам нужна новая пара координат, создайте новую. Простая реализация была бы: struct Rectangular { const float x, y; Rectangular(float x, float y) : x(x), y(y) {}; /* other methods */ };