Created
November 16, 2013 22:21
-
-
Save miketucker/7506124 to your computer and use it in GitHub Desktop.
Abstracted from the SvgVerlet.js class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Generated by CoffeeScript 1.6.3 | |
var RubberPoint, VerletPoint, VerletStick, | |
__hasProp = {}.hasOwnProperty, | |
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; | |
VerletPoint = (function() { | |
VerletPoint.prototype.down = false; | |
VerletPoint.prototype.oldX = null; | |
VerletPoint.prototype.oldY = null; | |
VerletPoint.prototype.originalX = 0; | |
VerletPoint.prototype.originalY = 0; | |
VerletPoint.prototype.x = 0; | |
VerletPoint.prototype.y = 0; | |
VerletPoint.prototype.forceX = 0; | |
VerletPoint.prototype.forceY = 0; | |
VerletPoint.scene = null; | |
function VerletPoint(x, y, locked) { | |
this.x = x; | |
this.y = y; | |
this.locked = locked != null ? locked : false; | |
this.originalX = this.oldX = this.x; | |
this.originalY = this.oldY = this.y; | |
} | |
VerletPoint.prototype.setPos = function(x, y) { | |
this.x = this.oldX = x; | |
return this.y = this.oldY = y; | |
}; | |
VerletPoint.prototype.force = function(x, y) { | |
this.forceX += x; | |
return this.forceY += y; | |
}; | |
VerletPoint.prototype.update = function() { | |
var tempX, tempY; | |
if (this.dead || this.down || this.locked) { | |
return null; | |
} | |
tempX = this.x; | |
tempY = this.y; | |
this.x += this.x - this.oldX + this.forceX; | |
this.y += this.y - this.oldY + this.forceY; | |
this.oldX = tempX; | |
this.oldY = tempY; | |
this.forceX = 0; | |
this.forceY = 0; | |
return null; | |
}; | |
return VerletPoint; | |
})(); | |
RubberPoint = (function(_super) { | |
__extends(RubberPoint, _super); | |
RubberPoint.prototype.rubberAmplitude = 0.1; | |
RubberPoint.prototype.rubberDamping = 0.1; | |
RubberPoint.prototype.rubberForceX = 0; | |
RubberPoint.prototype.rubberForceY = 0; | |
RubberPoint.maxAmp = 0.02; | |
RubberPoint.minAmp = 0.005; | |
function RubberPoint(x, y, locked) { | |
this.x = x; | |
this.y = y; | |
this.locked = locked != null ? locked : false; | |
RubberPoint.__super__.constructor.call(this, this.x, this.y, this.locked); | |
this.rubberAmplitude = RubberPoint.minAmp + (RubberPoint.maxAmp - RubberPoint.minAmp); | |
} | |
RubberPoint.prototype.update = function() { | |
if (this.dead || this.down || this.locked) { | |
return null; | |
} | |
this.rubberForceX = (this.originalX - this.x) * this.rubberAmplitude; | |
this.rubberForceY = (this.originalY - this.y) * this.rubberAmplitude; | |
this.x += this.rubberForceX; | |
this.y += this.rubberForceY; | |
return RubberPoint.__super__.update.call(this); | |
}; | |
RubberPoint.resetDefaults = function() { | |
RubberPoint.minAmp = 0.02; | |
return RubberPoint.maxAmp = 0.005; | |
}; | |
return RubberPoint; | |
})(VerletPoint); | |
VerletStick = (function() { | |
function VerletStick(a, b) { | |
var dx, dy, | |
_this = this; | |
this.pointa = a; | |
this.pointb = b; | |
this.torn = false; | |
this.tearResist = 9999; | |
dx = a.x - b.x; | |
dy = a.y - b.y; | |
this.hypotenuse = Math.sqrt(dx * dx + dy * dy); | |
if (this.pointa.locked && this.pointb.locked) { | |
this.contract(function() { | |
return null; | |
}); | |
} else if (this.pointa.locked) { | |
this.contract = function() { | |
var diff, h, offx, offy; | |
dx = _this.pointb.x - _this.pointa.x; | |
dy = _this.pointb.y - _this.pointa.y; | |
h = Math.sqrt(dx * dx + dy * dy); | |
if (h > _this.tearResist) { | |
_this.torn = true; | |
} | |
diff = _this.hypotenuse - h; | |
offx = diff * dx / h; | |
offy = diff * dy / h; | |
_this.pointb.x += offx; | |
_this.pointb.y += offy; | |
return null; | |
}; | |
} else if (this.pointb.locked) { | |
this.contract = function() { | |
var diff, h, offx, offy; | |
dx = _this.pointb.x - _this.pointa.x; | |
dy = _this.pointb.y - _this.pointa.y; | |
h = Math.sqrt(dx * dx + dy * dy); | |
if (h > _this.tearResist) { | |
_this.torn = true; | |
} | |
diff = _this.hypotenuse - h; | |
offx = diff * dx / h; | |
offy = diff * dy / h; | |
_this.pointa.x -= offx; | |
_this.pointa.y -= offy; | |
return null; | |
}; | |
} else { | |
this.contract = function() { | |
var diff, h, offx, offy; | |
dx = _this.pointb.x - _this.pointa.x; | |
dy = _this.pointb.y - _this.pointa.y; | |
h = Math.sqrt(dx * dx + dy * dy); | |
if (h > _this.tearResist) { | |
_this.torn = true; | |
} | |
diff = _this.hypotenuse - h; | |
offx = (diff * dx / h) * .5; | |
offy = (diff * dy / h) * .5; | |
_this.pointa.x -= offx; | |
_this.pointa.y -= offy; | |
_this.pointb.x += offx; | |
_this.pointb.y += offy; | |
return null; | |
}; | |
} | |
} | |
return VerletStick; | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment