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

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

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

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

Q&A

解決済

1回答

2374閲覧

斜めに移動する時の移動速度が速くなる現象を直したい。がこの実装は正しいのかどうか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2021/06/09 05:59

提示コードですが三平方の定理を使うやり方とcos sin 関数を使う方法の二つの方法で斜めに移動する際の移動が速くなるという現象を解消したいのですがどっちが正しいのでしょか?またこのコードは正しいのでしょうか?

イメージ説明

cpp

1 2// ##################################### 更新 ##################################### 3void Game::Update() 4{ 5 6 //glm::vec2 speed = glm::vec2(4, 3); 7 8 float dx = speed.x / std::sqrt((speed.x * speed.x) + (speed.y * speed.y)); 9 float dy = speed.y / std::sqrt((speed.x * speed.x) + (speed.y * speed.y)); 10 11 12 13 14 15 16 17 std::cout <<"aaa "<< speed.x * cos(PI / 6) << std::endl; 18 std::cout <<"aaa "<< speed.y * sin(PI / 6) << std::endl; 19 20 std::cout << speed.x * dx << std::endl; 21 std::cout << speed.y * dy << std::endl; 22 std::cout << std::endl; 23 24 25} 26

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

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

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

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

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

int32_t

2021/06/09 06:17

書いてみたコードで質問者さんの期待通りになっているのなら、何も問題はないのでは?
退会済みユーザー

退会済みユーザー

2021/06/09 06:18

これはどっちが正解なのでしょうか?値を表示させましたがわかりません
y_waiwai

2021/06/09 06:21

どっちも正解です それで実際に実装してみて、あなたが見ていい方を正解としましょう
int32_t

2021/06/09 06:28

正しいかどうかは質問者さんのアプリに組み込んでみて質問者さんの期待通りに動いているかどうかで判断してください。要件があいまいで、他人には判断できません。 もし、質問者さんにとって正しい結果が得られていないなら、もっと問題を説明してください。 ・「速くなる」というのは何に比べて速いのか ・質問者さんはどういう結果が正しいと思うのか ・コード中の speed.x speed.y dx dy とは何か
fana

2021/06/09 06:33

そもそも何をしたいのかがわからんのに,「合ってるか?」と問われても困る. (ぱっと見で,意味不明な演算ではある気がするが)
int32_t

2021/06/09 07:12

エスパー質問例「ゲームのキャラクターを左右に動かすときは (±N, 0)、上下に動かすときは (0, ±N) のベクトルを加算しています。斜めに移動するときに (±N, ±N) のベクトルで移動すると上下左右に比べて移動距離が大きすぎるのですが、上下左右と同じ移動距離にするにはどういうベクトルにしたらよいでしょうか?」
fana

2021/06/09 07:20

(おっと,今まさにそのような話とエスパーして回答したっす)
guest

回答1

0

ベストアンサー

解決しようとする課題

エスパー気味に問題の内容を以下のような話と捉えます.

例えば,

if( sキーが押されている ){ speed.x = 10; } if( zキーが押されている ){ speed.y = 10; } x方向にspeed.x,y方向にspeed.yだけ動かす

みたいなコードを書いているとき,

  • キーを単独で押したときは,移動量は10である.
  • 両方のキーを同時に押すと,{ x方向に10, y方向に10 }だけ移動するので,その移動量は10よりも大きい.

という話になってしまう.
で,これを後者の場合でも移動量を10にしたい,と.


解決方法

課題が上記のようである場合,
要は,「ベクトル speed の長さを(向きをそのままに)10にしたい」という話ですから,

//同時押し時の移動量 = sqrt(x方向移動量^2 + y方向移動量^2 ) float Len = sqrt((speed.x * speed.x) + (speed.y * speed.y)); //移動量の補正.移動速度を10にする. float rate = 10.0f / Len; //補正倍率 = 所望移動量/現移動量 speed.x *= Len; speed.y *= Len;

という話となるだろう.
(単位化してから10倍するだけですね)

投稿2021/06/09 07:19

fana

総合スコア11708

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

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

fana

2021/06/09 07:25

おっと, > どっちが正しいのでしょか?またこのコードは正しいのでしょうか? なる質問内容への明示的な回答が抜けてましたね. 回答としては「どっちもダメ」ですね.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問