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

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

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

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

JavaScript

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

Q&A

解決済

1回答

2565閲覧

何故、切り捨てると0除算してしまうのか。

aaaaaaaa

総合スコア501

canvas

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

JavaScript

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

0グッド

0クリップ

投稿2018/05/25 10:21

下記のソースのプロパティであるthis.startLifeの小数点の丸め方(端数処理)を切り上げ(ceil)ではなく切り捨て(floor)にすると実行途中にエラーが発生してしまいます。
エラー直前に0除算をしているようです。切り上げにするとこのようなことは、発生しません。

javascript

1var canvas = document.getElementById("canvas"), 2 3ctx = canvas.getContext("2d"), 4 5//パーティクルの数 6NUM = 22,//22 7LIFEMAX = 100,//寿命の上限 8particles = [], 9//図形の描画範囲 10W = 500, 11H = 500; 12 13canvas.width = canvas.height=500;//500pxと同義。 14 15 16window.requestAnimationFrame = 17 window.requestAnimationFrame || 18 window.mozRequestAnimationFrame || 19 window.webkitRequestAnimationFrame || 20 window.msRequestAnimationFrame || 21 function(cb) {setTimeout(cb,17);}; 22 23 24function Particle(ctx,x,y) { 25 this.ctx = ctx; 26 this.initialize(x,y); 27} 28Particle.prototype.initialize = function(x,y) { 29 this.x= x||0; 30 this.y= y||0; 31 this.radius=250;//終了円の半径 32 this.startLife = Math.floor(LIFEMAX*Math.random());//寿命の始まり(寿命の初期値)※ここをfloorにするとなぜかエラーとなる 33 this.life= this.startLife;//現在の寿命 34 console.log("startLife",this.startLife,"life",this.life) 35 36 //速度用のオブジェクトv 37 this.v= { 38 x:Math.random()*10-5,//X方向の速度。-5から4.9999...の何れかの数値がプロパティに代入される。 39 y:Math.random()*10-5//y方向の速度。 40 }; 41 this.color = {//floorは、少数を切り捨てる関数でrandomが0~0.9999...までの何れかの数値を算出する関数。 42 r:Math.floor(Math.random()*255), 43 g:Math.floor(Math.random()*255), 44 b:Math.floor(Math.random()*255), 45 a:1 46 }; 47}; 48 49for(var i=0; i<NUM;i++) { 50 positionX = Math.random() * 20;//X座標を0-19.9999...の間でランダムに 51 positionY = Math.random() * 20;//Y座標を0-19.9999...の間でランダムに 52 //初期配置と2dコンテキストをParticleに渡す。 53 particle = new Particle(ctx,positionX,positionY); 54 particles.push(particle); 55} 56 57 58//図形をずらす 59Particle.prototype.render = function() { 60 //console.log("あ",typeof draw); 61 this.updateParams(); 62 this.updatePosition(); 63 this.wrapPosition();//canvas外に消えた図形を要素内に再び表示させる。 64 this.draw(); 65}; 66 67//図形を描画する処理 68Particle.prototype.draw = function() { 69 //.4再度図形を描画する。 70 ctx = this.ctx; 71 72 //パスを初期化。ここでいうパスとは、領域の境界線のようなものだという。 73 ctx.beginPath(); 74 75 ctx.fillStyle = this.gradient();//階調 76 77 //ctx.rect(this.x,this.y,10,20); 78 79 //円形のパスを作成。Math.PIは、円の直径と円周の比率(円周/直径)、つまり円周率3.14...を返すやつだ。 80 ctx.arc(this.x,this.y,this.radius,2*Math.PI,false); 81 82 ctx.fill(); 83 84 //図形が重なった部分は、溶け合うように描写され、色が混ざりあうので白に近くなる。 85 ctx.globalCompositeOperation="lighter"; 86 87 ctx.closePath(); 88}; 89 90Particle.prototype.updateParams = function() { 91 var ratio = this.life/this.startLife;//寿命がどれくらい残っているか計算 92 console.log("計算式",this.life,"/",this.startLife) 93 console.log("ratio",ratio); 94 this.color.a=1-ratio;//ratioは1から0まで変化 95 this.radius = 30/ratio;//寿命に応じて半径も変化させる。 96 this.life-=1;//lifeを減らす 97 if(this.life===0) this.initialize();//lifeが0になったら再初期化 98} 99 100//描画した図形の位置をずらす 101Particle.prototype.updatePosition = function() { 102 //3.位置をずらす 103 this.x +=this.v.x; 104 this.y +=this.v.y; 105}; 106 107Particle.prototype.wrapPosition = function() { 108 //描画する図形が左端を超えてcanvas外に消えていったらcanvasの右端に消えていった図形を 109 //表示するようにする。逆に右端を超えて消えたら左端から描画した図形を表示させる。 110 if(this.x<0) this.x=W; 111 if(this.x>W) this.x=0; 112 if(this.y<0) this.y=H; 113 if(this.y>H) this.y=0; 114}; 115 116Particle.prototype.gradient = function() { 117 var col = this.color.r+","+this.color.g+","+this.color.b; 118 var g = this.ctx.createRadialGradient(this.x,this.y,0,this.x,this.y,this.radius); 119 g.addColorStop(0,"rgba("+col+","+(this.color.a*1)+")"); 120 g.addColorStop(0.5,"rgba("+col+","+(this.color.a*0.2)+")"); 121 g.addColorStop(1,"rgba("+col+","+(this.color.a*0)+")"); 122 return g; 123}; 124 125 126//1.図形を描画する。(描画サイクルの開始) 127render(); 128 129function render() { 130 //2.一度図形を消去する 131 ctx.clearRect(0,0,W,H); 132 133 //配列の各要素の関数renderを実行して図形を描画 134 particles.forEach(function(e) {e.render();}); 135 136 //5.一定時間を置く 137 requestAnimationFrame(render); 138}

jsdoit

実際のエラーが発生している画面
https://gyazo.com/06a86491ccd5ac7e288ed71993036939
エラー画面

なぜ、切り捨てるとゼロ除算してしまうのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

切り捨ての結果1未満の数値が0になってそれで除算したからです。

「1未満になるはずがないのになぜ0割りになるか?」

というご質問だろうと思うのですが、Math.random()は0以上1未満の疑似的な一様乱数を浮動小数点数つまり疑似的な実数で返す関数です。それに100を乗じたら0以上100未満の浮動小数点数になります。1%ほどですが0になる確率はあるということです。

投稿2018/05/25 10:50

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問