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

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

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

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1277閲覧

Javascriptのcanvasを使った衝突実験

kyuberou99

総合スコア1

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/10/12 07:10

編集2020/10/12 07:22

jsのcanvasを使った単純な四角の衝突プログラム

・javascriptのcanvas機能を理解するための練習をしています。
・四角形の物体2つを2D平面上のcanvas内で任意の方向で
等速で動かすプログラムを作成したい。
・物体は壁に当たると反射し、物体同士が当たっても反射するように作成したい。
・入射角、反射角が等しくなるようにし、反発係数は1です。
・プログラムは途中まで作成し、残り物体同士の反射の条件のみが作成できません。

発生している問題・エラーメッセージ

エラーは発生していません。

該当のソースコード

<!DOCTYPE html> <html> <head> </head> <body> <canvas id="canvas"></canvas> <script> // キャンバスの設定 let SCREEN_W = 500; let SCREEN_H = 400; let SCREEN_COLOR = 'skyblue';
let elm = document.getElementById('canvas'); let ctx = elm.getContext('2d'); elm.style.backgroundColor = SCREEN_COLOR; elm.width = SCREEN_W; elm.height = SCREEN_H; // 動く四角形に関するパラメータ let x1 = 100; let y1 = 150; let dx1 = 100; let dy1 = 70; let vx1 = 5; let vy1 = 4; let x2 = 200; let y2 = 300; let dx2 = 60; let dy2 = 60; let vx2 = 3; let vy2 = 2; // 物体動作のメインループ setInterval(main, 1000/60); function main() { ctx.clearRect(0, 0, SCREEN_W, SCREEN_H); // 物体1の設定 ctx.fillStyle = 'red'; ctx.fillRect(x1, y1, dx1, dy1); x1 += vx1; y1 += vy1; // 物体2の設定 ctx.fillStyle = 'yellow'; ctx.fillRect(x2, y2, dx2, dy2); x2 += vx2; y2 += vy2; // 壁との当たり判定 if (x1 <=0 || x1 + dx1 >= SCREEN_W) {vx1 *= -1} if (y1 <=0 || y1 + dy1 >= SCREEN_H) {vy1 *= -1} if (x2 <=0 || x2 + dx2 >= SCREEN_W) {vx2 *= -1} if (y2 <=0 || y2 + dy2 >= SCREEN_H) {vy2 *= -1} // 物体同士の衝突判定 if(x2 <= x1 + dx1 && x2 + dx2 >= x1 && y2 <= y1 + dy1 && y2 + dy2 >= y1) { // ここから先が作成できませんでした } } </script>
</body> </html> ```ここに言語名を入力 javascript ```

試したこと

物体が衝突する辺が上辺or下辺の場合はy軸速度を*-1、
物体が衝突する辺が右辺or左辺の場合はx軸速度を*-1すればいいと思うのですが、
計算式を考えていますが思いつきませんでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

yambejp

2020/10/12 07:25

四角形には意味がありますか? 2オブジェクトが衝突する際、角と面の衝突は別の意味をもちますか? 壁の角にまっすぐに入射したときは反射しないのですか?
guest

回答1

0

ベストアンサー

jsのcanvasを使った単純な四角の衝突プログラム

ええと、質問者様まずこのお題簡単ではないですよ?意外と円の方が簡単なんですが...

  1. 現在の四角形の状態から移動方向(ベクトル)に対するもっとも先端に位置する点を取得

(円だと1点で済むが四角形だと上位2点が必要)
これを仮に四角形A、四角形Bとして両方で求めておく

  1. 衝突の判定は四角形A上位1点が四角形Bの2点を結ぶ線と重なったかで判定

  2. 逆の場合も判定を行う

  3. 四角形A上位1点が衝突したとして四角形Aのベクトルと四角形Bの2点を結ぶ線から入射角度が判る。

  4. 四角形Aのベクトルを入射角度の反対の角度に変更

  5. 四角形Bのベクトルは四角形Aとのベクトルのから計算する(四角形Bの反発方向)

  6. 衝突が発生しているのでその分全移動量から減算

※ 本来は摩擦係数も含めないといけない(動きっぱなしになる。)

あと実際のソースは「ビリヤード javascript」で検索してみて下さい。
ここで書ける量ではないですし...

投稿2020/10/12 07:38

kuma_kuma_

総合スコア2506

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

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

kyuberou99

2020/10/12 12:07

回答ありがとうございます。 こんなに考えないといけない要素があるとは正直思っていませんでした。 四角にするから難しいということでしょうかね。 まずは円で考えてみたいと思います。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問