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

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

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

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

JavaScript

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

Q&A

解決済

3回答

231閲覧

なぜ、ヒダリに偏るのか

aaaaaaaa

総合スコア501

canvas

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

JavaScript

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

0グッド

1クリップ

投稿2018/01/12 10:47

編集2018/01/16 10:26

###発生している問題・エラーメッセージ
下記のソースは、描画した図形を無作為に動かすソースです。
this.vオブジェクトは、動く図形のはやさを指定しているのですが、random()*10だと図形の動く方向が右下にしか進みません。なぜなのでしょうか。

また、このrandom()*10に-5を加えrandom()*10-5とすると、ブレイクスルーjavascript79頁によれば左方向にも進むようになるそうです。
しかし、そのように指定すると確かにそうなりますが、肝心の図形がブラウザ左部に偏ってしまい動く図形のいくつかは、ブラウザに隠れた感じになってしまいます。なぜ、そうなってしまうのでしょうか。

###該当のソースコード
こちらが、前者の右下にしか進まないほうの動く図形です。
こちらが、その-5にしたことによって動く図形の一部がブラウザに覆い隠される状態となるものです。

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

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

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

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

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

defghi1977

2018/01/12 10:53

主観的なタイトルは質問のタイトルとして適切ではありません. 何がわからないのかがひと目で判るように変更して下さい.
aaaaaaaa

2018/01/16 10:27

ご意見ありがとうございます。題名を修正しました。
guest

回答3

0

前提として知るべきこと

  • Canvasの座標0,0は一番左上、座標のxが増えれば右方向、yが増えれば下方向へ移動していきます。
  • Math.random()は0から0.9999...の範囲のランダムな小数点を返す

解説

あなたのプログラムで、図形の初期位置はMath.random() * 20で初期化されています。
前提としてrandomは00.9999...を返すので、この計算式が取りうる範囲は019.9999...です。あなたのコードではcanvasの幅高さは500としてあるので、500のうち0〜19.9999...の場所にしか初期位置が来ないのであれば、それは左上に偏って当然です。おそらく「画面の中央付近からランダムな方向に発散する図形郡」を描きたいのではないでしょうか。それであれば初期値は画面中央付近に取らなければならないため、250付近にしなければなりません。キャンバス中央の250を中心に240〜260くらいの範囲で初期値をランダムにするのであれば、このような式になります。

JavaScript

1// 240 ~ 259.9999...の範囲に配置される 2positionX = 240 + Math.random() * 20; 3positionY = 240 + Math.random() * 20;

ただ、この書き方はあまり美しくないです。画面の中央から、という前提があるならこうしたほうがよりきれいでしょう。

JavaScript

1const RANDOM_RANGE = 20; // ランダムの範囲 2const CENTER_X = canvas.width / 2; // 画面の中央をcanvas.width,heightから計算 3const CENTER_Y = canvas.height / 2; 4 5// ランダムの範囲の半分を引くことで、0 ~ 19.9999の範囲を-10 ~ 9.9999...にずらす 6positionX = CENTER_X + (Math.random() * RANDOM_RANGE) - RANDOM_RANGE / 2; 7positionY = CENTER_Y + (Math.random() * RANDOM_RANGE) - RANDOM_RANGE / 2;

投稿2018/01/15 04:34

masaya_ohashi

総合スコア9206

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

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

0

ベストアンサー

Math.random関数が0以上1未満の乱数を返すことから自明です.

参考:
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/random


this.vオブジェクトは、動く図形のはやさを指定しているのですが、random()*10だと図形の動く方向が右下にしか進みません。なぜなのでしょうか。

Math.randomが返す値に10を掛けた値は常に正(0以上)となるわけですから, 全ての図形は正方向の速度をもっていることになります. つまりx座標として右向きの速度を, y座標として下向きの速度をもっているのですから, 図形は右下に動きます.

一方Math.random()*10-5とすればこの値は-5以上5未満となりますから, 図形は任意の方向に動きうることになります.

しかし、そのように指定すると確かにそうなりますが、肝心の図形がブラウザ左部に偏ってしまい動く図形のいくつかは、ブラウザに隠れた感じになってしまいます。なぜ、そうなってしまうのでしょうか。

-5の有無には全く関係しません. そもそも図形の初期位置が左に偏っているからです.

JavaScript

1for(var i=0; i<NUM;i++) { 2 //※positionXは、~dom() *120が正しいのか、それとも*20が正しいのか・・・?(76頁) 3 //↑正しいも何も初期位置を0〜120の範囲とするか0〜20の範囲とするかの違いに過ぎない 4 positionX = Math.random() * 20;//X座標を0-20の間でランダムに 5 positionY = Math.random() * 20;//X座標を0-20の間でランダムに 6 particle = new Particle(ctx,positionX,positionY); 7 particles.push(particle); 8} 9

投稿2018/01/12 11:09

defghi1977

総合スコア4756

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

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

0

原点が左上だからです。

投稿2018/01/12 11:01

hichon

総合スコア5737

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問