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

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

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

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

Q&A

解決済

2回答

1004閲覧

円が波の動きをするようにしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2023/05/20 10:34

編集2023/05/21 01:04

実現したいこと

円をx軸は固定で波打つ動きをするようにしたい。

前提

半径50の円を上下に波打つように動かしたいです。
正弦波を用いたいのですが、sinfの値をいくつにすれば正弦波になるのか分からないです。
ファイルは変えないで実装したいです。

該当のソースコード

#include <独自ファイル> (ラッパークラスです。)
#include <corecrt_math_defines.h>
#include <corecrt_math.h>

int posX = 640;int posY = 360;
float theta = 1.0f / 3.0f * float(M_PI);
float moveSpeed = 0.0f;//横に動く速さ
float amplitude = 20.0f;振幅
//円の位置を動かす。
posX += int(moveSpeed);
//波のように動かしたいのでsinfで求めた値に波の大きさをかけて好きな大きさにす。
posY =int(sinf(theta) * amplitude);

//2πで円一周。上下一回分の動きになるので、60フレームで1回上下するようになる。
theta += float(M_PI) / 30.0f;

theta += float(M_PI) / 30.0f;
//円の描画
DrawEllipse(int(posX),(posY), 50, 50, 0.0f, WHITE, kFillModeSolid);

c++

調査したこと
正弦波のことについて調べた

試したこと

ネットで正弦波のこと調べてほかの方のコード参考にしましたが、そもそも自分のコードと全体的に合わず。

補足情報(FW/ツールのバージョンなど)

visualstudio

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

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

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

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

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

thkana

2023/05/24 00:25 編集

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10280204310 Help参照の上ご対応ください。 https://teratail.com/help#posted-otherservice 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。 また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10280059475 あたりをみると、数式とそれが表している「世界」との繋がりがうまく捉えられていないような気がします...
episteme

2023/05/20 12:33

> 上下一回分の動きになるので、60フレームで1回上下するようになる。 その描画コードは一秒間に60回呼ばれるんですか?
退会済みユーザー

退会済みユーザー

2023/05/20 12:49

そういうわけではないと思います。 円一回上下するのが60フレームに1回ということです。 epistemeさんの解釈だと60フレームに一回新しい円が描画されるということですか?
episteme

2023/05/20 12:54

> そういうわけではないと思います。 ならばその描画コードが一秒間に何回呼ばれるか計測しましたか? それが毎秒N回なら角度変化は 2π/N[rad] になります。 あるいはN[FPS]で描きたいのなら、その描画コードが毎秒N回呼ばれるように実装してください。
episteme

2023/05/21 03:05

> ファイルは変えないで実装したいです。 「変えないで」とはいかなる意味ですか?
退会済みユーザー

退会済みユーザー

2023/05/21 04:06

ヘッダーファイルを質問のコードとはちがうファイルで回答してくださる方もいらっしゃるのですが、 なるべく同じヘッダーファイルにしてほしいという意味です
episteme

2023/05/21 04:24 編集

> #include <独自ファイル> こんなのどうしろと? >#include <corecrt_math_defines.h> > #include <corecrt_math.h> 標準ライブラリのヘッダじゃないし。
退会済みユーザー

退会済みユーザー

2023/05/21 04:27

独自ファイルは無視していいですが、もう二つはできないんですか? visualstudioででてくるはずですが。
episteme

2023/05/21 06:23

フツーに math.h じゃダメなん?
退会済みユーザー

退会済みユーザー

2023/05/22 03:50

visualstudioのヒント機能で出てま下
episteme

2023/05/22 06:33

ともかくも、「毎秒きっちり60回呼ばれる関数」さえ実装できれば、その中でマル描けばいいんじゃないん?
thkana

2023/05/24 00:25

「また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」 場のルールに従うつもりは無い、ということかしら。
guest

回答2

0

ベストアンサー

あくまで参考ですが、C/C++に強く依存する要素はなさそうなのでProcessingという言語で書いてみました。

Processing

1float posX ; 2float posY ; 3float theta = PI / 3; 4float moveSpeed = 0;//横に動く速さ(今回は縦だけ動けばいいので0) 5float amplitude = 20;//縦に動く速さ 6 7void setup() { 8 size(640, 360); 9 posX=640/2; 10 posY=360/2; 11} 12 13//円の位置を動かす。 14void draw() { 15 background(0xcc); //画面を指定色で塗りつぶす。アニメーションは、前の画を消して少し違う画を描くのが基本 16 posX += moveSpeed; 17 //「ある点を中心に」縦方向に動かす。波のような動きにしたい。 18 posY = sin(theta) * amplitude + 360/2; 19 //数式は「そのまま」書いた方があとでわからなくなりにくい 20 theta += TWO_PI / 60.0; 21 circle(posX, posY, 50); 22}

投稿2023/05/20 12:20

thkana

総合スコア7667

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

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

退会済みユーザー

退会済みユーザー

2023/05/20 12:52

コードを書いて下さりありがとうございます。 c++専なのでProcessingというのはよく分からないです。 書いていただいて申し訳ないのですが、すみません。 ですが今後に参考にしようと思います。
thkana

2023/05/20 13:18

teratailは「ITエンジニア特化型Q&Aサイト」ですからね。 ITエンジニアなら、言語が違うとは言えほとんどそっくりなサンプルがあれば十分に活かしていただけることと思います。まさか丸写しできなければダメなんてことはないですよね。(丸写しできるサンプルを作れるほどの情報は提供されていないわけだし)
guest

0

60回で一回りなら 2π/60 では?

DxLibで書いてみた:

C++

1#include <cmath> 2#include "DxLib.h" 3 4int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int) { 5 int step = 0; 6 7 if( DxLib_Init() == -1 ) { return -1; } // エラーが起きたら直ちに終了 8 SetDrawScreen( DX_SCREEN_BACK ); 9 // escapeキーが押されるまで繰り返す 10 while( ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0 ) { 11 ++step; 12 float theta = step * (2*3.1416f/60); // 一回あたり 2π/60[rad] 13 int x = static_cast<int>(cosf(theta) * 100); // 使ってません 14 int y = static_cast<int>(sinf(theta) * 100); 15 ClearDrawScreen(); // 画面クリア 16 DrawCircle(150, y+150, 50, GetColor(255,255,255), 0); // マル描いて 17 ScreenFlip(); // 表示 18 } 19 DxLib_End() ; 20 return 0 ; 21}

投稿2023/05/20 11:35

編集2023/05/21 03:53
episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2023/05/20 12:52

回答ありがとうございます。 後で試してみます。
episteme

2023/05/20 12:56

当然ですが、while-loopが一秒間に60回回る前提で書いてます。
fana

2023/05/21 03:25

> 3.2426f '1' の箇所が '2' に化けてる?
episteme

2023/05/21 03:51

おっとぉ... 修正しときますわー
退会済みユーザー

退会済みユーザー

2023/05/21 05:55

#include "DxLib.h" 入力しましたがヘッダーファイルが開けませんと出て使えませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問