递增然后递减弧画布html5的半径

时间:2017-11-02 14:50:37

标签: javascript html5 canvas

嗨我正试图在屏幕上移动时调整弧线以调整大小。 我似乎无法将增量值设置为弧的半径,以使其变大然后变小。

请参阅下面的相关代码块,然后查看整个代码。

resize(){

            this.up = true;
            this.r = 0;
            this.increment = 10;
            this.ceiling = 100;

            function PerformCalc() {
              if (this.up == true && this.r <= this.ceiling) {
                this.r += increment

                if (this.r == ceiling) {
                  this.up = false;
                }
              } else {
                  this.up = false
                  this.r -= increment;

                  if (this.r == 0) {
                    this.up = true;
                  }
              }
              console.log(this.r);
            }
            setInterval(PerformCalc, 1000);

        }

当我向控制台注销半径时,由于某种原因它会给出nan。 任何帮助将不胜感激。

&#13;
&#13;
<!DOCTYPE html>
    
    <html>
    
    <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
      <head>
        <meta charset="UTF-8">
        <title>Canvas</title>
    
        <style type="text/css">
    		canvas {
    			border: 1px solid grey; 
    		}
        </style>
    
      </head>
    
      <body>
    
        <canvas id="canvas-for-ball"></canvas>
    
        <script type="text/javascript">
    		// Gets a handle to the element with id canvasOne.
    		var canvas = document.getElementById("canvas-for-ball");
    		// Get a 2D context for the canvas.
    		var ctx = canvas.getContext("2d");
    		function init(){
                canvas.width = 500;
                canvas.height = 500;
    			
            }
            init();
            //angle defining spin and sections of ball
    		var theta = 0;
    		//for the sections of the ball
    		var theta2 = 0;
    		//fort he amount of sections needed
    		var seventh = (Math.PI*2)/7
    		//to control the amount of spin the ball has
    		var thetaInc = 0.0029;
            //ball object
    		class Ball {
    			constructor(x,y,r,xvel,yvel,mass){
    				this.x =x;
    				this.y = y;
    				this.r =r;
    				this.xvel = xvel;
    				this.yvel = yvel;
                    this.mass = mass;
    			}
                draw(){
    				// Update the y location.
    				this.x = this.x + this.xvel;
    				this.y = this.y + this.yvel;
    				//draw circle
    				ctx.beginPath();
    				ctx.arc(this.x,this.y,this.r,0,Math.PI*2,false);
    				ctx.stroke();
    				//fill the circle
    				ctx.fillStyle = "orange";
    				ctx.fill();
    				//draw inner circle of ball
    				ctx.beginPath();
    				ctx.arc(this.x,this.y,this.r*.9,0,Math.PI*2,false);
    				ctx.stroke();
    				//spin control
    				theta += thetaInc;
    				//loop for adding sections to pie
    				for( var n = 0; n < 7; ++n) {  // add loop to draw radii
    					theta2 = theta + n * seventh;
    					ctx.moveTo( this.x, this.y);
    					ctx.lineTo( this.x + this.r*Math.cos(theta2), this.y + this.r*Math.sin(theta2));
    					}
    				ctx.lineWidth = "2";
    				ctx.lineCap = "round";
    				ctx.strokeStyle = "black";
    				ctx.stroke();			
    			}
                move(){	
    				//condition take into account the this.r of the ball so 
    				//it bounces at the edge of the canvas instead 
    				//of going off of the screen to its center point.
    				if(this.y > canvas.height - this.r || this.y - this.r <0){
    					this.yvel = -1*this.yvel;
    					//to reverse the direction of the ball when hitting walls
    					if((this.xvel<0 && this.yvel >0) && thetaInc <0){
    						thetaInc = -1*thetaInc;
    					}
    					else if((this.xvel <0 && this.yvel>0) && thetaInc >0){
    						thetaInc = -1*thetaInc
    					}
    					else if((this.xvel >0 && this.yvel >0) && thetaInc >0){
    						thetaInc = -1 * thetaInc;
    					}
    					else if((this.xvel > 0 && this.yvel < 0)&& thetaInc <0){
    						thetaInc = -1 * thetaInc;
    					}
    				}
    				if(this.x > canvas.width - this.r || this.x - this.r < 0){
    					this.xvel = -1*this.xvel;
    				}  				
    			}
    			resize(){
    				
    				this.up = true;
    				this.r = 0;
    				this.increment = 10;
    				this.ceiling = 100;
    				
    				function PerformCalc() {
    				  if (this.up == true && this.r <= this.ceiling) {
    					this.r += increment
    				
    					if (this.r == ceiling) {
    					  this.up = false;
    					}
    				  } else {
    					  this.up = false
    					  this.r -= increment;
    				
    					  if (this.r == 0) {
    						this.up = true;
    					  }
    				  }
    				  console.log(this.r);
    				}
    				setInterval(PerformCalc, 1000);
    				  
      			}
    
    				
    				  
    				 
    			colour(){
    
    			}
                
    
            }
       
    			//Intersect function takes a ball as a perameter
    			//ball will be the the object used to test if the two are touching.
    			
    			function intersect(ball,ball1) {
    			//the x and y cordinates of the first ball are subtracted from the test ball and stored
    			//in productX and productY
    		    var productX = ball1.x - ball.x;
    		    var productY = ball1.y - ball.y;
    			//pythagoras theorem is used to get the distance between both center points of each circle.
    		    var distance = Math.sqrt(productX * productX + productY * productY);
    			//A condition is used to check if the distance between both bencer point of each circle
    			//is less than or equal to the sum of both radii the circles are touching.
    			//the result is p[rinted out to the console
    		    if (distance <= (ball1.r + ball.r)) {
    		      
                  dx = ball.x-ball1.x;
                  dy = ball.y-ball1.y;
                  collision_angle = Math.atan2(dy,dx);
                  magnitude_1 = Math.sqrt(ball.xvel*ball.xvel+ball.yvel*ball.yvel);
                  magnitude_2 = Math.sqrt(ball1.xvel*ball1.xvel+ball1.yvel*ball1.yvel);
    
                  direction_1 = Math.atan2(ball.yvel, ball.xvel);
                  direction_2 = Math.atan2(ball1.yvel, ball1.xvel);
    
                  new_xvel_1 = magnitude_1 * Math.cos(direction_1-collision_angle);
                  new_yvel_1 = magnitude_1 * Math.sin(direction_1-collision_angle);
                  new_xvel_2 = magnitude_2 * Math.cos(direction_2-collision_angle);
                  new_yvel_2 = magnitude_1 * Math.sin(direction_2-collision_angle);
    
                  final_xvel_1 = ((ball.mass-ball1.mass)*new_xvel_1+(ball1.mass+ball1.mass)*new_xvel_2)/(ball.mass+ball1.mass);
                  final_xvel_2 = ((ball.mass+ball.mass)*new_xvel_1+(ball1.mass-ball.mass)*new_xvel_2)/(ball.mass+ball1.mass);
    
                  final_yvel_1 = new_yvel_1;
                  final_yvel_2 = new_yvel_2;
    
                  ball.xvel = Math.cos(collision_angle)*final_xvel_1+Math.cos(collision_angle+Math.PI/2)*final_yvel_1;
                  ball.yvel = Math.sin(collision_angle)*final_xvel_1+Math.sin(collision_angle+Math.PI/2)*final_yvel_1;
                  ball1.xvel = Math.cos(collision_angle)*final_xvel_2+Math.cos(collision_angle+Math.PI/2)*final_yvel_2;
                  ball1.yvel = Math.sin(collision_angle)*final_xvel_2+Math.sin(collision_angle+Math.PI/2)*final_yvel_2;
                } 
    		  }
        canvas.addEventListener("click", function(event) { 
        	var clickX = event.clientX - canvas.offsetLeft;
        	var clickY = event.clientY- canvas.offsetTop;
        	b1.x = clickX;
        	b1.y = clickY;  
        });
    		// Add a Javascript event listener to the keypress event.
    		window.addEventListener("keypress", function(event) { 
    			// Just log the event to the console.
    			console.log(event);
    		});
    
    		//keypresses with jQuery
    		$(document.body).on('keydown', function(e) {
    			console.log(e.which);
    			switch (e.which) {
    				// key code for left arrow
    				case 37:
    				console.log('left arrow key pressed!');
    				b1.xvel --;
    				break;
    				//keycode for up
    				case 38:
    				console.log('up key pressed');
    				b1.yvel++;
    				break;
    				//key code for right
    				case 39:
    				console.log('right arrow key pressed!');
    				b1.xvel++;
    				break;
    				//key code for down
    				case 40:
    				console.log('down arrow key pressed!');
    				b1.yvel--;
    				break;
    				//key code for + key to increase spin
    				case 107:
    				console.log('down arrow key pressed!');
    				thetaInc +=.001;
    				break;
    				//key code for - key to decrease spin
    				case 109:
    				console.log('down arrow key pressed!');
    				thetaInc -=.001;
    				break;
    			}
    		});
    	b1 = new Ball(200,200,40,1,1,50);
        b2 = new Ball(100,100,40,2,2,5);
    	b1.resize();
        // A function to repeat every time the animation loops.
    	function repeatme() {
    		//clear canvas for each frame of the animation.
    		ctx.clearRect(0,0,500,500);
    		// Draw the ball (stroked, not filled).
    		b1.draw();
            b2.draw();
            b1.move();
    		
            b2.move();
            intersect(b1,b2);
    		//put repeatme function into the animation frame and store it in animate
    		animate =  window.requestAnimationFrame(repeatme);	
    	}
         // Get the animation going.
    	repeatme();
       
        </script>
    
      </body>
    
    </html>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

增量有一个参考错误,例如你没有使用this.increment,同样的天花板,应该是this.ceiling。

setInterval使用它,因此您可以将其保存为可以使用它们。这将删除NaN。

<!DOCTYPE html>
    
    <html>
    
    <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
      <head>
        <meta charset="UTF-8">
        <title>Canvas</title>
    
        <style type="text/css">
    		canvas {
    			border: 1px solid grey; 
    		}
        </style>
    
      </head>
    
      <body>
    
        <canvas id="canvas-for-ball"></canvas>
    
        <script type="text/javascript">
    		// Gets a handle to the element with id canvasOne.
    		var canvas = document.getElementById("canvas-for-ball");
    		// Get a 2D context for the canvas.
    		var ctx = canvas.getContext("2d");
    		function init(){
                canvas.width = 500;
                canvas.height = 500;
    			
            }
            init();
            //angle defining spin and sections of ball
    		var theta = 0;
    		//for the sections of the ball
    		var theta2 = 0;
    		//fort he amount of sections needed
    		var seventh = (Math.PI*2)/7
    		//to control the amount of spin the ball has
    		var thetaInc = 0.0029;
            //ball object
    		class Ball {
    			constructor(x,y,r,xvel,yvel,mass){
    				this.x =x;
    				this.y = y;
    				this.r =r;
    				this.xvel = xvel;
    				this.yvel = yvel;
                    this.mass = mass;
    			}
                draw(){
    				// Update the y location.
    				this.x = this.x + this.xvel;
    				this.y = this.y + this.yvel;
    				//draw circle
    				ctx.beginPath();
    				ctx.arc(this.x,this.y,this.r,0,Math.PI*2,false);
    				ctx.stroke();
    				//fill the circle
    				ctx.fillStyle = "orange";
    				ctx.fill();
    				//draw inner circle of ball
    				ctx.beginPath();
    				ctx.arc(this.x,this.y,this.r*.9,0,Math.PI*2,false);
    				ctx.stroke();
    				//spin control
    				theta += thetaInc;
    				//loop for adding sections to pie
    				for( var n = 0; n < 7; ++n) {  // add loop to draw radii
    					theta2 = theta + n * seventh;
    					ctx.moveTo( this.x, this.y);
    					ctx.lineTo( this.x + this.r*Math.cos(theta2), this.y + this.r*Math.sin(theta2));
    					}
    				ctx.lineWidth = "2";
    				ctx.lineCap = "round";
    				ctx.strokeStyle = "black";
    				ctx.stroke();			
    			}
                move(){	
    				//condition take into account the this.r of the ball so 
    				//it bounces at the edge of the canvas instead 
    				//of going off of the screen to its center point.
    				if(this.y > canvas.height - this.r || this.y - this.r <0){
    					this.yvel = -1*this.yvel;
    					//to reverse the direction of the ball when hitting walls
    					if((this.xvel<0 && this.yvel >0) && thetaInc <0){
    						thetaInc = -1*thetaInc;
    					}
    					else if((this.xvel <0 && this.yvel>0) && thetaInc >0){
    						thetaInc = -1*thetaInc
    					}
    					else if((this.xvel >0 && this.yvel >0) && thetaInc >0){
    						thetaInc = -1 * thetaInc;
    					}
    					else if((this.xvel > 0 && this.yvel < 0)&& thetaInc <0){
    						thetaInc = -1 * thetaInc;
    					}
    				}
    				if(this.x > canvas.width - this.r || this.x - this.r < 0){
    					this.xvel = -1*this.xvel;
    				}  				
    			}
    			resize(){
    				var that = this;
    				that.up = true;
    				that.r = 0;
    				that.increment = 10;
    				that.ceiling = 100;
    				function PerformCalc() {
    				  if (that.up == true && that.r <= that.ceiling) {
    					that.r += that.increment
    				
    					if (that.r == that.ceiling) {
    					  that.up = false;
    					}
    				  } else {
    					  that.up = false
    					  that.r -= that.increment;
    				
    					  if (that.r == 0) {
    						that.up = true;
    					  }
    				  }
    				  console.log(that.r);
    				}
    				setInterval(PerformCalc, 1000);
    				  
      			}
    
    				
    				  
    				 
    			colour(){
    
    			}
                
    
            }
       
    			//Intersect function takes a ball as a perameter
    			//ball will be the the object used to test if the two are touching.
    			
    			function intersect(ball,ball1) {
    			//the x and y cordinates of the first ball are subtracted from the test ball and stored
    			//in productX and productY
    		    var productX = ball1.x - ball.x;
    		    var productY = ball1.y - ball.y;
    			//pythagoras theorem is used to get the distance between both center points of each circle.
    		    var distance = Math.sqrt(productX * productX + productY * productY);
    			//A condition is used to check if the distance between both bencer point of each circle
    			//is less than or equal to the sum of both radii the circles are touching.
    			//the result is p[rinted out to the console
    		    if (distance <= (ball1.r + ball.r)) {
    		      
                  dx = ball.x-ball1.x;
                  dy = ball.y-ball1.y;
                  collision_angle = Math.atan2(dy,dx);
                  magnitude_1 = Math.sqrt(ball.xvel*ball.xvel+ball.yvel*ball.yvel);
                  magnitude_2 = Math.sqrt(ball1.xvel*ball1.xvel+ball1.yvel*ball1.yvel);
    
                  direction_1 = Math.atan2(ball.yvel, ball.xvel);
                  direction_2 = Math.atan2(ball1.yvel, ball1.xvel);
    
                  new_xvel_1 = magnitude_1 * Math.cos(direction_1-collision_angle);
                  new_yvel_1 = magnitude_1 * Math.sin(direction_1-collision_angle);
                  new_xvel_2 = magnitude_2 * Math.cos(direction_2-collision_angle);
                  new_yvel_2 = magnitude_1 * Math.sin(direction_2-collision_angle);
    
                  final_xvel_1 = ((ball.mass-ball1.mass)*new_xvel_1+(ball1.mass+ball1.mass)*new_xvel_2)/(ball.mass+ball1.mass);
                  final_xvel_2 = ((ball.mass+ball.mass)*new_xvel_1+(ball1.mass-ball.mass)*new_xvel_2)/(ball.mass+ball1.mass);
    
                  final_yvel_1 = new_yvel_1;
                  final_yvel_2 = new_yvel_2;
    
                  ball.xvel = Math.cos(collision_angle)*final_xvel_1+Math.cos(collision_angle+Math.PI/2)*final_yvel_1;
                  ball.yvel = Math.sin(collision_angle)*final_xvel_1+Math.sin(collision_angle+Math.PI/2)*final_yvel_1;
                  ball1.xvel = Math.cos(collision_angle)*final_xvel_2+Math.cos(collision_angle+Math.PI/2)*final_yvel_2;
                  ball1.yvel = Math.sin(collision_angle)*final_xvel_2+Math.sin(collision_angle+Math.PI/2)*final_yvel_2;
                } 
    		  }
        canvas.addEventListener("click", function(event) { 
        	var clickX = event.clientX - canvas.offsetLeft;
        	var clickY = event.clientY- canvas.offsetTop;
        	b1.x = clickX;
        	b1.y = clickY;  
        });
    		// Add a Javascript event listener to the keypress event.
    		window.addEventListener("keypress", function(event) { 
    			// Just log the event to the console.
    			console.log(event);
    		});
    
    		//keypresses with jQuery
    		$(document.body).on('keydown', function(e) {
    			console.log(e.which);
    			switch (e.which) {
    				// key code for left arrow
    				case 37:
    				console.log('left arrow key pressed!');
    				b1.xvel --;
    				break;
    				//keycode for up
    				case 38:
    				console.log('up key pressed');
    				b1.yvel++;
    				break;
    				//key code for right
    				case 39:
    				console.log('right arrow key pressed!');
    				b1.xvel++;
    				break;
    				//key code for down
    				case 40:
    				console.log('down arrow key pressed!');
    				b1.yvel--;
    				break;
    				//key code for + key to increase spin
    				case 107:
    				console.log('down arrow key pressed!');
    				thetaInc +=.001;
    				break;
    				//key code for - key to decrease spin
    				case 109:
    				console.log('down arrow key pressed!');
    				thetaInc -=.001;
    				break;
    			}
    		});
    	b1 = new Ball(200,200,40,1,1,50);
        b2 = new Ball(100,100,40,2,2,5);
    	b1.resize();
        // A function to repeat every time the animation loops.
    	function repeatme() {
    		//clear canvas for each frame of the animation.
    		ctx.clearRect(0,0,500,500);
    		// Draw the ball (stroked, not filled).
    		b1.draw();
            b2.draw();
            b1.move();
    		
            b2.move();
            intersect(b1,b2);
    		//put repeatme function into the animation frame and store it in animate
    		animate =  window.requestAnimationFrame(repeatme);	
    	}
         // Get the animation going.
    	repeatme();
       
        </script>
    
      </body>
    
    </html>