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.AddMass = function(Mass)
|
||||||
{
|
{
|
||||||
this.Masses.push(Mass);
|
this.Masses.push(Mass);
|
||||||
|
return Mass;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.AddConstraint = function(Constraint)
|
||||||
|
{
|
||||||
|
this.Constraints.push(Constraint);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Update = function(TimeDelta)
|
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)
|
for (k in this.Masses)
|
||||||
{
|
{
|
||||||
var m = this.Masses[k];
|
var m = this.Masses[k];
|
||||||
|
@ -39,6 +54,18 @@ var Mass = function(X, Y, Weight)
|
||||||
this.PX = this.X;
|
this.PX = this.X;
|
||||||
this.PY = this.Y;
|
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)
|
// add gravity (mgt^2/2)
|
||||||
VY = VY + (this.Weight * (9.98 * (TimeDelta*TimeDelta)) / 2) * 100;
|
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);
|
var v = new Verlet(800, 600);
|
||||||
v.AddMass(new Mass(5, 5, 1));
|
var m1 = v.AddMass(new Mass(5, 5, 1));
|
||||||
v.AddMass(new Mass(20, 5, 1));
|
var m2 = v.AddMass(new Mass(55, 100, 1));
|
||||||
v.AddMass(new Mass(35, 5, 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 c = document.getElementById("main");
|
||||||
var ctx = c.getContext('2d');
|
var ctx = c.getContext('2d');
|
||||||
|
@ -103,6 +169,18 @@ setInterval(function()
|
||||||
ctx.closePath();
|
ctx.closePath();
|
||||||
ctx.fill();
|
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);
|
}, 1000/50);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue