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

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

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

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

Q&A

解決済

2回答

2062閲覧

ベジェ曲線を使って半円を正確に描く方法が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2021/05/16 09:53

提示コードですが提示画像の赤線のうに正確に半円をベジェ曲線として描くにはどうすればいいのでしょうか?キー入力を実装して色々値を変えてみましたがどうもこの画像ような偏った半円しか描けません。

画像はキー入力で上にすこしずらしたものです。

イメージ説明

cpp

1 2glm::vec2 test(glm::vec2 start, glm::vec2 end,float t,glm::vec2 se) 3{ 4 float x = (1 - t) * (1 - t) * start.x + 2 * (1 - t) * t + se.x + t * t * end.x; 5 float y = (1 - t) * (1 - t) * start.y + 2 * (1 - t) * t + se.y + t * t * end.y; 6 7 8 std::cout << x << std::endl; 9 std::cout << y << std::endl; 10 return glm::vec2(x,y); 11} 12 13float lr = 0; 14glm::vec2 AD = glm::vec2(0,0); 15 16//更新 17void Game::Update() 18{ 19 if (windowContext->getKeyInput(GLFW_KEY_A) > 0) 20 { 21 AD.x += 1; 22 23 } 24 else if (windowContext->getKeyInput(GLFW_KEY_D) > 0) 25 { 26 AD.x += -1; 27 28 } 29 else if (windowContext->getKeyInput(GLFW_KEY_W) > 0) 30 { 31 AD.y += 1; 32 33 } 34 else if (windowContext->getKeyInput(GLFW_KEY_S) > 0) 35 { 36 AD.y += -1; 37 38 } 39 40 41 42 43 44 45 46 player->Update(); 47 float a = 0; 48 float t = 0; 49 for (std::vector<Coin>::iterator itr = line->begin(); itr != line->end(); itr++) 50 { 51 itr->setPosition(test(player->getPosition(), coin->getPosition(), a, AD)); 52 t += 100; 53 a += 0.1f; 54 } 55 56 57 58 59 60 61 62} 63 64//レンダリング 65void Game::Renderer() 66{ 67 68 69 player->Draw(); 70 coin->Draw(); 71 72 for (std::vector<Coin>::iterator itr = line->begin(); itr != line->end(); itr++) 73 { 74 itr->Draw(); 75 } 76 77 78}

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

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

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

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

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

dodox86

2021/05/16 10:36

なぜベジエ曲線で「半円を正確に描く」のか謎。一般的に比較的自由に点を入力し、その点を通るなめらかな曲線を描くためにベジエ曲線を使うのでは?
退会済みユーザー

退会済みユーザー

2021/05/16 10:44

確かにそうなのですがちょっとやってみたいので。また提示画像の曲線以外の曲線が描けないので
退会済みユーザー

退会済みユーザー

2021/05/16 12:09 編集

過去、回答で行った計算式の間違いへの指摘は意図して無視していますか? そもそもの計算式が間違っているのでベジェ曲線としても正しく計算できていません
thkana

2021/05/16 12:23

ゲームだから構わないと言えばそうだけど、そういう運動は放物線軌道なのでは...
guest

回答2

0

ベストアンサー

ベジエ曲線は、多項式関数で表現できる曲線しか描けません。一方、半円は多項式関数で表現できません。

投稿2021/05/16 12:18

HogeAnimalLover

総合スコア4830

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

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

退会済みユーザー

退会済みユーザー

2021/05/17 01:49

出来ない場合どういった代行手段があるのでしょうか?
int32_t

2021/05/17 04:10

何かがジャンプしたり物を投げたりする動きなら、thkana さんのコメントの通り放物線(等加速度運動) でしょうね。
HogeAnimalLover

2021/05/17 10:39

ベジエ曲線について考えるどころか、むしろ円のほうが楽です。中心C(x0, y0)から距離Rの円は(x0 + RcosT, y0 + RsinT)で示すことができます(Tは角度パラメータ)。後は目的の半円になるように角度Tを動かせばいいだけです。代行手段どころか、こちらの方が楽です。
guest

0

何故,ベジェで円弧を描きたいのかわかりませんが,
円弧を近似するにしても両端以外の制御点を通らないベジェだと面倒そうに思います.
制御点を通るスプラインを使った方が「円っぽい曲線」を作る作業は楽なのではないでしょうか.

投稿2021/05/17 08:43

fana

総合スコア11708

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問