Javascript 在矩形中移动对象
假设我有一个物体(比如一个球),我想在一个矩形(或正方形、三角形)中移动。我知道我可以用正反方向移动圆形(或任何其他圆形)中的对象,但是如何在矩形/三角形中移动呢 下面是代码示例:Javascript 在矩形中移动对象,javascript,html5-canvas,Javascript,Html5 Canvas,假设我有一个物体(比如一个球),我想在一个矩形(或正方形、三角形)中移动。我知道我可以用正反方向移动圆形(或任何其他圆形)中的对象,但是如何在矩形/三角形中移动呢 下面是代码示例: function Ball(radius, color) { this.radius = radius || 40; this.color = color || "#ff0000"; this.x = 0; this.y = 0; this.rotation = 0;
function Ball(radius, color) {
this.radius = radius || 40;
this.color = color || "#ff0000";
this.x = 0;
this.y = 0;
this.rotation = 0;
this.scaleX = 1;
this.scaleY = 1;
this.lineWidth = 1;
}
Ball.prototype.draw = function (c) {
// code for drawing ball
}
function drawRightTriangle(h, w, range) {
// Code for triangle
}
// Initialize the ball
var ball = new Ball();
ball.x = cw/2, ball.y = ch/2, ball.radius = 10;
var speed = 0.05,
range = 50,
height = 0,
hypo = 0,
base = 0;
// Here I have use, base = 3, hypo = 5, height = 3 for limits;
(function drawFrame() {
window.requestAnimationFrame(drawFrame);
c.clearRect(0, 0, cw, ch);
ball.x = cw/2 + base*range;
if(base > 3) {
base = 3;
ball.y = ch/2 - height*range;
height += speed;
if(height > 4) {
height = 4;
// Now what to do
// Also, I think this function is messy.
}
}
base += speed;
drawRightTriangle(4, 3, range);
ball.draw(c);
}());
这是我到目前为止所做的演示:您可以沿着这样的线段获得XY
var dx = endX - startX;
var dy = endY - startY;
var x = startX + dx*percent;
var y = startY + dy*percent;
如果你想以匀速制作动画,它会变得有点复杂
您必须预先计算要行驶的距离(线段长度总和)
然后你需要沿着路径以相等的距离移动你的球
下面是代码和小提琴:
正文{背景色:象牙色;填充:10px;}
#画布{边框:1px纯红;}
$(函数(){
var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
ctx.fillStyle=“红色”;
点=[{x:50,y:125},{x:200,y:50},{x:200,y:200},{x:50,y:125}];
var-totDistance=0;
对于(var i=0;i0){
//检查我们是否完成了
if(currentPoint>=points.length-1){console.log(“完成”);return;}
var pt0=点[currentPoint];
var pt1=点[currentPoint+1];
var dx=pt1.x-pt0.x;
var dy=pt1.y-pt0.y;
var lastX,lastY;
如果(pt0.untraveled),我认为如果您还添加一些您已经拥有的代码,以便使用sin/cos移动它,这将是非常有用的,这样我们可以更好地可视化它。
<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; padding:10px; }
#canvas{border:1px solid red;}
</style>
<script>
$(function(){
var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
ctx.fillStyle="red";
points = [{x:50, y:125},{x:200,y:50},{x:200,y:200},{x:50,y:125}];
var totDistance=0;
for (var i = 0; i<points.length-1;i++){
var p = points[i],
q = points[i+1],
dx = p.x - q.x,
dy = p.y - q.y,
dist = Math.sqrt(dx*dx + dy*dy);
totDistance+=dist;
points[i].dist=dist;
points[i].untraveled=dist;
}
var steps=150;
var distancePerStep=totDistance/steps;
var totTraveled=0;
var currentPoint=0;
// drop first ball
drawBall(points[0].x,points[0].y);
animate();
function animate(){
var mustTravel=distancePerStep;
while(mustTravel>0){
// check if we're done
if(currentPoint >= points.length-1){console.log("done"); return;}
var pt0=points[currentPoint];
var pt1=points[currentPoint+1];
var dx=pt1.x-pt0.x;
var dy=pt1.y-pt0.y;
var lastX,lastY;
if(pt0.untraveled<mustTravel){
// travel this whole segment
lastX=pt1.x;
lastY=pt1.y;
// and reduce d by length traveled
mustTravel -= pt0.untraveled;
pt0.untraveled = 0;
if(mustTravel<1){mustTravel=0;}
// go onto the next point
currentPoint++;
}else{
// travel only part of this segment
// It has enough available length to complete travel
// start at the previously traveled point on the segment
var prevTraveled = pt0.dist - pt0.untraveled;
var x1 = pt0.x + dx * prevTraveled/pt0.dist;
var y1 = pt0.y + dy * prevTraveled/pt0.dist;
// travel only part of segment
var x2 = x1 + dx * mustTravel/pt0.dist;
var y2 = y1 + dy * mustTravel/pt0.dist;
// update segement and untraveled
lastX=x2;
lastY=y2;
pt0.untraveled -= mustTravel;
mustTravel=0;;
}
}
// drop a ball
drawBall(lastX,lastY);
setTimeout(animate,17);
}
function drawBall(x,y){
ctx.clearRect(0,0,canvas.width,canvas.height);
drawPath();
ctx.beginPath();
ctx.arc(x,y,10,0,Math.PI*2,false);
ctx.closePath();
ctx.fill();
ctx.stroke();
}
function drawPath(){
ctx.beginPath();
ctx.moveTo(points[0].x,points[0].y);
for(var i=1;i<points.length;i++){
var point=points[i];
ctx.lineTo(point.x,point.y);
}
ctx.stroke();
}
}); // end $(function(){});
</script>
</head>
<body>
<canvas id="canvas" width=360 height=350></canvas>
</body>
</html>