Seems to be working?
parent
89117810cb
commit
67d3517fa9
84
main.js
84
main.js
|
@ -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);
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue