質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

986閲覧

cosとsinの計算結果が違う。

langhtorn

総合スコア105

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/07/10 03:29

###実現したいこと
平面上の点を、原点を中心に回転させた後の座標を出力したい。
###試したこと
std::cout<<theta<<"ラジアンは"<<thdo<<"度\n";をしたら60.00..と出てきたのでラジアンの変換はできています。
###問題点
C++による誤差なのかもしれないのですが、回転させた後の座標が違う気がします。
手計算でvoid rotateの中の式x=x*cos(thdo)-y*sin(thdo);を計算してみたところ4になりました。
計算結果とあまりにも違います。
三角関数のプログラムの仕方を学習したばかりなのであまり使い方がわかりません。教えてください。
ちなみに、1.0472radは約60°です。
また、回転させた後の座標を見る際にこちらのサイトを参考にしました。これによると、実行結果は(2,3.4641)になるはずです。
実行結果

平面上の点を1つ入力してください: 4 0 回転させる角度を入力してください(※角度はラジアンを単位として): 1.0472 回転させた後の座標は (-3.80948,1.16168)

###コード

C++

1//点の回転 2 3#include<iostream> 4#include<cmath> 5 6//x座標y座標の定義 7struct point 8{ 9 double x; //x座標 10 double y; //y座標 11 12 //原点を中心に反時計回りにθだけ回転させるメンバ関数 13 void rotate(double theta){ 14 double pai=std::acos(-1.0); //円周率π 15 double thdo=theta*(180/pai); //ラジアンを度にする 16 //std::cout<<theta<<"ラジアンは"<<thdo<<"度\n"; 17 x=x*cos(thdo)-y*sin(thdo); 18 //std::cout<<"x座標"<<x; 19 y=x*sin(thdo)+y*cos(thdo); //点(x,y)を原点を中心にθだけ回転させると(xcosθ-ysinθ,xsinθ+ycosθ)となる 20 } 21}; 22 23int main() 24{ 25 point p; 26 double kakudo; 27 std::cout<<"平面上の点を1つ入力してください: "; 28 std::cin>>p.x; 29 std::cin>>p.y; 30 std::cout<<"回転させる角度を入力してください(※角度はラジアンを単位として): "; 31 std::cin>>kakudo; 32 p.rotate(kakudo); 33 34 std::cout<<"回転させた後の座標は\n"; 35 std::cout<<"("<<p.x<<","<<p.y<<")"; 36 37 return 0; 38}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

x=x*cos(thdo)-y*sin(thdo); // [1] y=x*sin(thdo)+y*cos(thdo); // [2]

[1]をやると、xが書き換わってるので[2]の結果が狂います。

投稿2020/07/10 03:35

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

langhtorn

2020/07/10 04:17

xの値が変わらないよう先に別の変数に置いたらできました。ありがとうございます。
episteme

2020/07/10 04:19

これまでの質問を見ると、このテの"不注意"が原因のものが多いようで...
guest

0

cos,sinの使い方を勘違いしていたようです。
cosθのθの部分の単位はラジアンでした。度ではないみたいです。それを治したら解けました!

C++

1//点の回転 2 3#include<iostream> 4#include<cmath> 5 6//x座標y座標の定義 7struct point 8{ 9 double x; //x座標 10 double y; //y座標 11 12 //原点を中心に反時計回りにθだけ回転させるメンバ関数 13 void rotate(double theta){ 14 /*double pai=std::acos(-1.0); //円周率π 15 double thdo=theta*(180/pai); //ラジアンを度にする 16 std::cout<<theta<<"ラジアンは"<<thdo<<"度\n";*/ 17 double dx=x; //x座標が変わらないように置いておく 18 //std::cout<<"cos(thdo)="<<cos(theta)<<"\n"; 19 x=dx*cos(theta)-y*sin(theta); 20 //std::cout<<"x座標"<<x; 21 //std::cout<<"dx="<<dx; 22 y=dx*sin(theta)+y*cos(theta); //点(x,y)を原点を中心にθだけ回転させると(xcosθ-ysinθ,xsinθ+ycosθ)となる 23 } 24}; 25 26int main() 27{ 28 point p; 29 double kakudo; 30 std::cout<<"平面上の点を1つ入力してください: "; 31 std::cin>>p.x; 32 std::cin>>p.y; 33 std::cout<<"回転させる角度を入力してください(※角度はラジアンを単位として): "; 34 std::cin>>kakudo; 35 p.rotate(kakudo); 36 37 std::cout<<"回転させた後の座標は\n"; 38 std::cout<<"("<<p.x<<","<<p.y<<")"; 39 40 return 0; 41} 42 43/*実行結果 44平面上の点を1つ入力してください: 4 0 45回転させる角度を入力してください(※角度はラジアンを単位として): 1.0472 46回転させた後の座標は 47(1.99999,3.46411) 48*/

投稿2020/07/10 04:20

langhtorn

総合スコア105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問