C++ - 参照を使用したデカルト座標から極座標への変換、および極座標からデカルト座標への変換

okwaves2024-01-25  12

デカルトと極の間で変換するためのリファレンスを使用して単純なコンバータを作成しようとしていますが、問題は、間違った答えが得られ、場合によっては 0 ,0 になることです。何が問題なのか、どうすれば解決できるのか知りたいです。 これがコードです:

#include <iostream>
#include <cmath>
using namespace std;
void cartesianToPolar(int x,int y,float &r,float &q ) {
r = sqrt(x * x + y * y); q = atan(y / x);
}
void polarToCartesian(float r, float q, int &x, int &y) {
    x = r * cos(q); y = r * sin(q);
}
int main() {
    int cevap ;
    int  x = 0 , y = 0 ,xx = 0 , yy = 0;
    float r = 0 , q = 0 , rr = 0 , qq = 0 ;
    cout << "Choose please....." << endl;
    cout << "1-Cartesian -> polar "<<endl;
    cout << "2-polar ->Cartesian " << endl;
    cin >> cevap;
    if(cevap==1){
    cout << "enter x value: " ;
    cin >> x;
    cout << "enter y value: " ;
    cin >> y;
  
    cartesianToPolar(x,y,rr,qq);
    cout << "r:  " << rr << "        " << "Q: " << qq << endl;
    }
    else if (cevap==2)
    {
        cout << "enter r value : ";
        cin >> rr;
        cout << "enter Q value: ";
        cin >> qq;
        polarToCartesian(r, q, xx, yy);

        cout << "x: " << xx << "        " << "y: " << yy << endl;
    }
    return 0;
}

1

良いケースと悪いケースのサンプルを入力および出力してください。悪いケースの何が間違っていると思われるかを説明してください。

– ユノシュ

2020 年 9 月 3 日 10:45

1

なぜ int と float を交互に繰り返すのですか?リスクがあります stackoverflow.com/questions/588004/…

– ユノシュ

2020 年 9 月 3 日 10:45

@Yunnosch 良いケースはありません。常に次のような間違った答えが得られます: x 値を入力: 5 y 値を入力: 5 r: 7.07107 Q: 0.785398 。 C++ を学習していますが、学習していませんfloat と int を一緒に使用するのは良くないことを知ってください

– MrXQ

2020 年 9 月 3 日 10:48

2

x = 0 の場合を処理するには、atan(y/x) ではなく atan2(y, x) を使用する必要があることに注意してください。

– ダミアン

2020 年 9 月 3 日 10:50

1

vあなたが 5,5 に対して与える値は、私が極座標として期待しているものとまったく同じです。何が問題なのか説明してください。

– ユノシュ

2020 年 9 月 3 日 10:59



------------------------

両方の関数の結果は、整数ではなく浮動小数点である必要があります。

void cartesianToPolar(float x, float y, float &r, float &q ) {
    r = sqrt(x * x + y * y); q = atan(y / x);
}

void polarToCartesian(float r, float q, float &x, float &y) {
    x = r * cos(q); y = r * sin(q);
}

計算していた値は正しかったですが、結果は後で整数に変換されました。 int への変換は切り捨てによって行われます。つまり、0.1 と 0.9 はすべて 0 になります。

メインの極座標からデカルト座標への変換にもタイプミスがありました。間違った変数を使用しました。正解は次のとおりです。

polarToCartesian(rr, qq, xx, yy);

@Yunnosch のコメントに従って、atan() ではなく atan2() を使用する必要があります。デタイLED の説明はここにあります

5

2

真剣に。atan() の代わりに atan2() を使用してください。そうでないと最悪です。

– ユノシュ

2020 年 9 月 3 日 11:00

1

@Yunnosch - 投稿に追加されましたが、実際には C++ や C で使用したことがないため、気づきませんでした。

– あたる

2020 年 9 月 3 日 11:05

1

@MrXQ - 喜んで!

– あたる

2020 年 9 月 3 日 11:06

大丈夫です。 「悲惨なこと」の声を下げるべきだ。このユースケースのために特別に作られているため、驚くほど便利です。

– ユノシュ

2020 年 9 月 3 日 11:06

1

デカルト座標を整数のみにするのは、意図的な設計上の決定である可能性があります。修正はキャスト sqrt(double(x * x + y * y)), atan2((double)y, (double)x); です。

– 

user1196549

2020 年 9 月 3 日 12:45

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。