#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 */ };