HTML5JavaScript画布中的弹丸运动仿真
我希望模拟抛射体的运动(以一定的速度离开地面,一直持续到球再次落地),忽略空气阻力。我正在使用HTML5和JavaScript的画布功能来实现这一点。我是JavaScript的新手,因此非常感谢您的帮助 这是到目前为止我的代码。我一次又一次地遇到同样的错误:输入意外结束。我还尝试包括开始、停止和重置按钮,以及用户输入自己角度的选项,以便他们可以看到最终水平距离的变化 我尝试了许多不同的方法来消除这个错误;我错过了什么HTML5JavaScript画布中的弹丸运动仿真,javascript,html,canvas,Javascript,Html,Canvas,我希望模拟抛射体的运动(以一定的速度离开地面,一直持续到球再次落地),忽略空气阻力。我正在使用HTML5和JavaScript的画布功能来实现这一点。我是JavaScript的新手,因此非常感谢您的帮助 这是到目前为止我的代码。我一次又一次地遇到同样的错误:输入意外结束。我还尝试包括开始、停止和重置按钮,以及用户输入自己角度的选项,以便他们可以看到最终水平距离的变化 我尝试了许多不同的方法来消除这个错误;我错过了什么 <html> <head> <titl
<html>
<head>
<title>
Projectile Motion
</title>
</head>
<body>
<button onclick=settimer()>Start</button><br>
<button onclick=reset()>Reset</button><br>
<button onclick=cleartimer()>Stop</button><br>
Angle=<input type="text" id="Angle in Degrees" value=45></input>
<canvas id="mycanvas" height="600" width="600"></canvas>
<script>
function rectang() {
co.beginPath();
co.rect(0,0,600,600);
co.stroke();
}
var gravity
var Angle
var velocity
var velocityx
var velocityy
var distance
var co
var inc
var time
var x
var y
var radius
//list variables
function init() {
var can;
can = document.getElementById("mycanvas");
co = can.getContext("2d");
reset();
}
function reset() {
gravity = 5;
Angle = (45*(Math.PI)/180);
velocity = 10;
velocityx = velocity*Math.cos(Angle);
velocityy = velocity*Math.sin(Angle);
time = 0;
distance = velocityx*time;
inc = 0.5;
x = 0;
y = 600;
radius = 10;
}
function draw() {
co.clearRect(0,0,600,600);
circle(co,x,y,radius,"yellow",false)
time = time + inc;
x = x + velocityx*time;
y = y + velocityy*time;
velocityx = velocityx;
velocityy = velocityy + velocityy*time;
}
function settimer() {
if (timer == null) timer = setInterval(draw,time);
Angle = document.getElementById("Angle").value;
}
function cleartimer(){
clearInterval(timer);
timer = null;
}
init();
function circle(context,x,y,r,color,fill) {
if (fill == true) {
//if fill is true, fill the circle
var temp = context.fillStyle;
context.fillStyle = color;
context.beginPath();
context.arc(x,y,r,0,2*Math.PI);
context.fill();
context.fillStyle = temp;
}
else {
//if fill is false, don't fill the circle
var temp = context.strokeStyle;
context.strokeStyle = color;
context.beginPath();
context.arc(x,y,r,0,2*Math.PI);
context.stroke();
context.strokeStyle = temp;
}
</script>
</body>
</html>
弹丸运动
开始
重置
停止
角度=
函数rectang(){
co.beginPath();
co.rect(0,0600600);;
co.stroke();
}
变重力
变差角
var速度
var velocityx
var velocityy
var距离
var公司
var公司
变量时间
变量x
变量y
变异半径
//列出变量
函数init(){
var-can;
can=document.getElementById(“mycanvas”);
co=can.getContext(“2d”);
重置();
}
函数重置(){
重力=5;
角度=(45*(数学PI)/180);
速度=10;
velocityx=速度*数学cos(角度);
velocityy=速度*数学sin(角度);
时间=0;
距离=速度x*时间;
inc=0.5;
x=0;
y=600;
半径=10;
}
函数绘图(){
co.clearRect(0,0600600);
圆(co,x,y,半径,“黄色”,假)
时间=时间+公司;
x=x+velocityx*时间;
y=y+velocityy*时间;
velocityx=velocityx;
velocityy=velocityy+velocityy*时间;
}
函数settimer(){
如果(计时器==null)计时器=setInterval(绘图,时间);
角度=document.getElementById(“角度”).value;
}
函数cleartimer(){
清除间隔(计时器);
定时器=空;
}
init();
函数圆(上下文、x、y、r、颜色、填充){
if(fill==true){
//如果fill为true,则填充圆
var temp=context.fillStyle;
context.fillStyle=颜色;
context.beginPath();
弧(x,y,r,0,2*Math.PI);
context.fill();
context.fillStyle=temp;
}
否则{
//如果fill为false,则不要填充圆
var temp=context.strokeStyle;
context.strokeStyle=颜色;
context.beginPath();
弧(x,y,r,0,2*Math.PI);
stroke();
context.strokeStyle=temp;
}
存在一些问题,主要是一些双增量,其中“时间”在每个循环中都越来越大,x/y值也在增加。此外,对于“速度y”,您应该在开始时使用负值(子弹越来越高),然后根据重力添加一些内容。黄色在这里不太可读
函数rectang(){
co.beginPath();
co.rect(0,0600600);;
co.stroke();
}
变重力
变差角
var速度
var velocityx
var velocityy
var距离
var公司
var公司
变量时间
变量x
变量y
变异半径
//列出变量
函数init(){
var-can;
can=document.getElementById(“mycanvas”);
co=can.getContext(“2d”);
重置();
}
函数重置(){
重力=5;
角度=(45*(数学PI)/180);
速度=10;
velocityx=速度*数学cos(角度);
速度y=速度*数学正弦(角度)*-1;
时间=0;
距离=速度x*时间;
inc=0.5;
x=0;
y=300;
半径=10;
}
函数绘图(){
//console.log(x,y)
co.clearRect(0,0600300);
圆(co,x,y,半径,“黄色”,假)
时间=时间+公司;
x=x+velocityx*inc;
y=y+velocityy*inc;
velocityx=velocityx;
velocityy=velocityy+重力*inc*0.1;
}
var定时器=null;
函数settimer(){
如果(计时器==null)计时器=setInterval(绘图,时间);
角度=document.getElementById(“角度”).value;
}
函数cleartimer(){
清除间隔(计时器);
定时器=空;
}
init();
函数圆(上下文、x、y、r、颜色、填充){
x=数学圆(x)
y=数学圆(y)
//控制台日志(x、y、r、颜色、填充)
if(fill==true){
//如果fill为true,则填充圆
var temp=context.fillStyle;
context.fillStyle=颜色;
context.beginPath();
弧(x,y,r,0,2*Math.PI);
context.fill();
context.fillStyle=temp;
}
否则{
//如果fill为false,则不要填充圆
var temp=context.strokeStyle;
context.beginPath();
弧(x,y,r,0,2*Math.PI);
context.strokeStyle=颜色;
context.lineWidth=4;
stroke();
context.strokeStyle=temp;
}
}
开始
重置
停止
角度=
JavaScript不是Java。最后一个函数循环缺少一个结尾}。