Skip to content

Commit 594aadb

Browse files
authored
Merge pull request #4048 from CrypticGuy/master
bug in angleBetween() #3973
2 parents dd9cf98 + cd66ac0 commit 594aadb

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

src/math/p5.Vector.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1181,18 +1181,22 @@ p5.Vector.prototype.rotate = function rotate(a) {
11811181
* </code>
11821182
* </div>
11831183
*/
1184+
11841185
p5.Vector.prototype.angleBetween = function angleBetween(v) {
11851186
const dotmagmag = this.dot(v) / (this.mag() * v.mag());
11861187
// Mathematically speaking: the dotmagmag variable will be between -1 and 1
11871188
// inclusive. Practically though it could be slightly outside this range due
11881189
// to floating-point rounding issues. This can make Math.acos return NaN.
11891190
//
11901191
// Solution: we'll clamp the value to the -1,1 range
1191-
const angle = Math.acos(Math.min(1, Math.max(-1, dotmagmag)));
1192-
if (this.p5) return this.p5._fromRadians(angle);
1192+
let angle;
1193+
angle = Math.acos(Math.min(1, Math.max(-1, dotmagmag)));
1194+
angle = angle * Math.sign(this.cross(v).z || 1);
1195+
if (this.p5) {
1196+
angle = this.p5._fromRadians(angle);
1197+
}
11931198
return angle;
11941199
};
1195-
11961200
/**
11971201
* Linear interpolate the vector to another vector
11981202
*

test/unit/math/p5.Vector.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,26 +120,29 @@ suite('p5.Vector', function() {
120120
test('should not trip on rounding issues in 2D space', function() {
121121
var v1 = myp5.createVector(-11, -20);
122122
var v2 = myp5.createVector(-5.5, -10);
123-
expect(v1.angleBetween(v2)).to.be.closeTo(0, 0.00001);
123+
var res = v1.angleBetween(v2);
124+
//expect(Math.abs(v1.angleBetween(v2))).to.be.closeTo(0, 0.00001);
125+
expect(res).to.be.closeTo(0, 0.00001);
124126

125127
var v3 = myp5.createVector(-11, -20);
126128
var v4 = myp5.createVector(5.5, 10);
129+
expect(Math.abs(v3.angleBetween(v4))).to.be.closeTo(180, 0.00001);
127130
expect(v3.angleBetween(v4)).to.be.closeTo(180, 0.00001);
128131
});
129132

130133
test('should not trip on rounding issues in 3D space', function() {
131134
var v1 = myp5.createVector(1, 1.1, 1.2);
132135
var v2 = myp5.createVector(2, 2.2, 2.4);
133136

134-
var angle = v1.angleBetween(v2);
137+
var angle = Math.abs(v1.angleBetween(v2));
135138
expect(angle).to.be.closeTo(0, 0.00001);
136139
});
137140

138141
test('should return NaN for zero vector', function() {
139142
var v1 = myp5.createVector(0, 0, 0);
140143
var v2 = myp5.createVector(2, 3, 4);
141144

142-
expect(v1.angleBetween(v2)).to.be.NaN; // jshint ignore:line
145+
expect(Math.abs(v1.angleBetween(v2))).to.be.NaN; // jshint ignore:line
143146
expect(v2.angleBetween(v1)).to.be.NaN; // jshint ignore:line
144147
});
145148
});
@@ -869,14 +872,15 @@ suite('p5.Vector', function() {
869872
v2 = new p5.Vector(2, 2, 0);
870873
res = v1.angleBetween(v2);
871874
expect(res).to.be.closeTo(Math.PI / 4, 0.01);
875+
expect(v2.angleBetween(v1)).to.be.closeTo(-1 * Math.PI / 4, 0.01);
872876
});
873877
});
874878

875879
suite('with [2,0,0] and [-2,0,0]', function() {
876880
test('should be 180 deg difference', function() {
877881
v1 = new p5.Vector(2, 0, 0);
878882
v2 = new p5.Vector(-2, 0, 0);
879-
res = v1.angleBetween(v2);
883+
res = Math.abs(v1.angleBetween(v2));
880884
expect(res).to.be.closeTo(Math.PI, 0.01);
881885
});
882886
});
@@ -885,14 +889,23 @@ suite('p5.Vector', function() {
885889
test('should be 135 deg difference', function() {
886890
v1 = new p5.Vector(2, 0, 0);
887891
v2 = new p5.Vector(-2, -2, 0);
888-
res = v1.angleBetween(v2);
889-
expect(res).to.be.closeTo(Math.PI / 2 + Math.PI / 4, 0.01);
892+
expect(v1.angleBetween(v2)).to.be.closeTo(
893+
-1 * (Math.PI / 2 + Math.PI / 4),
894+
0.01
895+
);
896+
expect(v2.angleBetween(v1)).to.be.closeTo(
897+
Math.PI / 2 + Math.PI / 4,
898+
0.01
899+
);
890900
});
891901

892902
test('should be commutative', function() {
893903
v1 = new p5.Vector(2, 0, 0);
894904
v2 = new p5.Vector(-2, -2, 0);
895-
expect(v1.angleBetween(v2)).to.be.closeTo(v2.angleBetween(v1), 0.01);
905+
expect(Math.abs(v1.angleBetween(v2))).to.be.closeTo(
906+
Math.abs(v2.angleBetween(v1)),
907+
0.01
908+
);
896909
});
897910
});
898911
});

0 commit comments

Comments
 (0)