From 78090c2f6232444ba9d2727af6617a52bcfaf349 Mon Sep 17 00:00:00 2001 From: Chris Greene Date: Sun, 21 Apr 2013 11:10:10 -0700 Subject: [PATCH] Bounds checking modified to remove spinning By having the particles stop at the first point where they cross the boundary line, we prevent the artificial torque exerted on the semi-rigid body. --- images/error_type1.png | Bin 0 -> 5630 bytes js/verlet-js/verlet.js | 51 ++++++++++++++++++++++++++++++++++------- 2 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 images/error_type1.png diff --git a/images/error_type1.png b/images/error_type1.png new file mode 100644 index 0000000000000000000000000000000000000000..bdcde3b374485ef04bb12ed7873c8c887f215550 GIT binary patch literal 5630 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 pEj this.height-1) - particle.pos.y = this.height-1; + v.mutableSet(particle.pos); + v.mutableSub(particle.lastPos); + if (particle.pos.y > this.height-1) { + particle.pos.mutableSet( + intersectionPoint(new Vec2(0,this.height-1), particle.lastPos, new Vec2(1,0), v)); + } - if (particle.pos.x < 0) - particle.pos.x = 0; + if (particle.pos.x < 0) { + particle.pos.mutableSet( + intersectionPoint(new Vec2(0,0), particle.pos, new Vec2(0,1), v)); + } - if (particle.pos.x > this.width-1) - particle.pos.x = this.width-1; + if (particle.pos.x > this.width-1) { + particle.pos.mutableSet( + intersectionPoint(new Vec2(this.width-1,0), particle.pos, new Vec2(0,1), v)); + } } var _this = this; @@ -227,4 +263,3 @@ VerletJS.prototype.nearestEntity = function() { return entity; } -