Seems to be working?

master
q3k 2013-02-25 13:17:55 +01:00
parent 89117810cb
commit 67d3517fa9
1 changed files with 81 additions and 3 deletions

84
main.js
View File

@ -9,10 +9,25 @@ var Verlet = function(Width, Height)
this.AddMass = function(Mass)
{
this.Masses.push(Mass);
return Mass;
}
this.AddConstraint = function(Constraint)
{
this.Constraints.push(Constraint);
}
this.Update = function(TimeDelta)
{
for (k in this.Constraints)
{
var c = this.Constraints[k];
if (typeof(c) == "function")
continue;
c.Update(TimeDelta);
}
for (k in this.Masses)
{
var m = this.Masses[k];
@ -39,6 +54,18 @@ var Mass = function(X, Y, Weight)
this.PX = this.X;
this.PY = this.Y;
// shitty air friction
if (VY > 0)
VY = VY - TimeDelta
else
VY = VY + TimeDelta
if (VX > 0)
VX = VX - TimeDelta
else
VX = VX + TimeDelta
// add gravity (mgt^2/2)
VY = VY + (this.Weight * (9.98 * (TimeDelta*TimeDelta)) / 2) * 100;
@ -71,10 +98,49 @@ var Mass = function(X, Y, Weight)
}
}
var Constraint = function(Mass1, Mass2)
{
this.Mass1 = Mass1;
this.Mass2 = Mass2;
this.Distance = Math.sqrt(Math.pow(Mass1.X - Mass2.X, 2) + Math.pow(Mass1.Y - Mass2.Y, 2));
this.Update = function(TimeDelta)
{
var d1 = Math.sqrt(Math.pow(this.Mass1.X - this.Mass2.X, 2) + Math.pow(this.Mass1.Y - this.Mass2.Y, 2));
var d2 = (d1 - this.Distance) / d1;
var coefm1;
var coefm2;
if (!this.Mass1.Active)
{
coefm1 = 0;
coefm2 = 1;
}
else if (!this.Mass2.Active)
{
coefm1 = 1;
coefm2 = 0;
}
else
{
coefm1 = (this.Mass1.Weight / (this.Mass1.Weight + this.Mass2.Weight));
coefm2 = (this.Mass2.Weight / (this.Mass1.Weight + this.Mass2.Weight));
}
this.Mass1.X = this.Mass1.X - (this.Mass1.X - this.Mass2.X) * d2 * coefm1;
this.Mass2.X = this.Mass2.X + (this.Mass1.X - this.Mass2.X) * d2 * coefm2;
this.Mass1.Y = this.Mass1.Y - (this.Mass1.Y - this.Mass2.Y) * d2 * coefm1;
this.Mass2.Y = this.Mass2.Y + (this.Mass1.Y - this.Mass2.Y) * d2 * coefm2;
}
}
var v = new Verlet(800, 600);
v.AddMass(new Mass(5, 5, 1));
v.AddMass(new Mass(20, 5, 1));
v.AddMass(new Mass(35, 5, 1));
var m1 = v.AddMass(new Mass(5, 5, 1));
var m2 = v.AddMass(new Mass(55, 100, 1));
var m3 = v.AddMass(new Mass(105, 5, 1));
v.AddConstraint(new Constraint(m1, m2));
v.AddConstraint(new Constraint(m2, m3));
v.AddConstraint(new Constraint(m1, m3));
var c = document.getElementById("main");
var ctx = c.getContext('2d');
@ -103,6 +169,18 @@ setInterval(function()
ctx.closePath();
ctx.fill();
}
ctx.strokeStyle = '#FFFFFF';
for (k in v.Constraints)
{
var c = v.Constraints[k];
if (typeof(c) == "function")
continue;
ctx.beginPath();
ctx.moveTo(c.Mass1.X, c.Mass1.Y);
ctx.lineTo(c.Mass2.X, c.Mass2.Y);
ctx.stroke();
}
}, 1000/50);