Răsfoiți Sursa

Merge remote-tracking branch 'drewnoakes/test/vector3/angleto' into dev

Mr.doob 12 ani în urmă
părinte
comite
35c1478572
2 a modificat fișierele cu 24 adăugiri și 2 ștergeri
  1. 5 1
      src/math/Vector3.js
  2. 19 1
      test/unit/math/Vector3.js

+ 5 - 1
src/math/Vector3.js

@@ -564,7 +564,11 @@ THREE.extend( THREE.Vector3.prototype, {
 
 	angleTo: function ( v ) {
 
-		return Math.acos( this.dot( v ) / this.length() / v.length() );
+		var theta = this.dot( v ) / ( this.length() * v.length() );
+
+		// clamp, to handle numerical problems
+
+		return Math.acos( THREE.Math.clamp ( theta, -1, 1 ) );
 
 	},
 

+ 19 - 1
test/unit/math/Vector3.js

@@ -286,10 +286,28 @@ test( "reflect", function() {
 	ok( b.copy( a ).reflect( normal ).equals( new THREE.Vector3( 1, 1, 0 ) ), "Passed!" );
 
 	a.set( 1, -1, 0 );
-	normal.set( 0, -1, 0 )
+	normal.set( 0, -1, 0 );
 	ok( b.copy( a ).reflect(  normal ).equals( new THREE.Vector3( -1, -1, 0 ) ), "Passed!" );
 });
 
+test( "angleTo", function() {
+	var a = new THREE.Vector3( 0, -0.18851655680720186, 0.9820700116639124 );
+	var b = new THREE.Vector3( 0, 0.18851655680720186, -0.9820700116639124 );
+
+	equal( a.angleTo( a ), 0 );
+	equal( a.angleTo( b ), Math.PI );
+
+	var x = new THREE.Vector3( 1, 0, 0 );
+	var y = new THREE.Vector3( 0, 1, 0 );
+	var z = new THREE.Vector3( 0, 0, 1 );
+
+	equal( x.angleTo( y ), Math.PI / 2 );
+	equal( x.angleTo( z ), Math.PI / 2 );
+	equal( z.angleTo( x ), Math.PI / 2 );
+
+	ok( Math.abs( x.angleTo( new THREE.Vector3( 1, 1, 0 ) ) - ( Math.PI / 4 ) ) < 0.0000001 );
+});
+
 test( "lerp/clone", function() {
 	var a = new THREE.Vector3( x, 0, z );
 	var b = new THREE.Vector3( 0, -y, 0 );