#javascript #canvas
Итак, у нас есть математический маятник.
Помогите реализовать, чтобы маятник ударялся о шар, и шар катился.
var canvas = document.getElementById("canvas")
var ctx = canvas.getContext("2d")
var ctx2 = canvas2.getContext("2d")
var h = canvas.height = 500
var w = canvas.width = 600
var h2 = canvas2.height = 0.1
// var w2 = canvas2.width = 800
ctx.translate(w / 2, h / 2)
// ctx2.translate(0,h2/2)
// ctx2.beginPath()
// ctx2.moveTo(0,0)
var initPhi = Math.PI * 0.2
var L = 200
var dt = 1 / 60
var g = 1500
var t = 0
bob = {
phi: initPhi,
v: 3.5,
a: 4
}
function drawPendulum() {
ctx.beginPath()
ctx.arc(Math.sin(bob.phi) * L, Math.cos(bob.phi) * L, 10, 0, 2 * Math.PI)
ctx.fill()
ctx.moveTo(0, 0)
ctx.lineTo(Math.sin(bob.phi) * L, Math.cos(bob.phi) * L)
ctx.stroke()
}
function update() {
// L*phi''=-g*sin(phi)
bob.a = -(g / L) * Math.sin(bob.phi)
bob.v += bob.a * dt
bob.phi += bob.v * dt
// t += dt
}
function drawGraph() {
// ctx2.lineTo(t*20,(bob.phi%Math.PI)*20 )
// ctx2.stroke()
}
function draw() {
ctx.clearRect(-w / 2, -h / 2, w, h)
drawPendulum()
update()
// drawGraph()
requestAnimationFrame(draw)
}
draw()
* {
padding: 0;
margin: 0;
}
canvas {
display: block;
margin: 0 auto;
}
Ответы
Ответ 1
var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); var h = canvas.height = 500; var w = canvas.width = 600; ctx.translate(w / 2, h / 2); const L = 200; const dt = 1 / 60; const g = 1500; const bob = { phi: Math.PI * 0.2, v: 2.5, a: 4, r: 10 }; function drawPendulum() { ctx.beginPath() ctx.arc(bob.x, bob.y, bob.r, 0, 2 * Math.PI) ctx.fill() ctx.moveTo(0, 0) ctx.lineTo(bob.x, bob.y) ctx.stroke() } // Шарик const ball = { x: 0, y: 200, r: 10, v: 0, draw(){ ctx.beginPath(); ctx.arc(this.x, this.y, this.r, 0, 2*Math.PI); ctx.fill(); } } function update() { bob.a = -(g / L) * Math.sin(bob.phi); bob.phi += bob.v * dt; bob.v += bob.a * dt; ball.x += ball.v * dt; // Перенесём расчет координат сюда, чтоб здесь же проверить коллизию: bob.x = Math.sin(bob.phi) * L; bob.y = Math.cos(bob.phi) * L; // Проверяем коллизию: if(Math.abs(bob.x - ball.x) <= 2*ball.r && Math.abs(bob.y - ball.y) <= 2*ball.r){ // если столкнулись - передадим импульс: const bobV = bob.v * L; // Домножаем на плечо, потому что V у вас угловая скорость // Неупругий удар, массы будем считать равными bob.v = ball.v / L; ball.v = bobV; } // Типа отскок от стенки, чтоб было веселей) if(Math.abs(ball.x) + ball.r > 300) ball.v = -ball.v; } (function draw(dt) { update(); ctx.clearRect(-w / 2, -h / 2, w, h) drawPendulum() ball.draw(); requestAnimationFrame(draw); })(); canvas { display: block; margin: 0 auto; padding: 0; }
Комментариев нет:
Отправить комментарий