123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- /**
- * @author bhouston / http://exocortex.com
- * @author mrdoob / http://mrdoob.com/
- */
- THREE.Triangle = function ( a, b, c ) {
- this.a = ( a !== undefined ) ? a : new THREE.Vector3();
- this.b = ( b !== undefined ) ? b : new THREE.Vector3();
- this.c = ( c !== undefined ) ? c : new THREE.Vector3();
- };
- THREE.Triangle.normal = function() {
- var v0 = new THREE.Vector3();
- return function( a, b, c, optionalTarget ) {
- var result = optionalTarget || new THREE.Vector3();
- result.subVectors( c, b );
- v0.subVectors( a, b );
- result.cross( v0 );
- var resultLengthSq = result.lengthSq();
- if( resultLengthSq > 0 ) {
- return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );
- }
- return result.set( 0, 0, 0 );
- };
- }();
- // static/instance method to calculate barycoordinates
- // based on: http://www.blackpawn.com/texts/pointinpoly/default.html
- THREE.Triangle.barycoordFromPoint = function() {
- var v0 = new THREE.Vector3(),
- v1 = new THREE.Vector3(),
- v2 = new THREE.Vector3();
- return function ( point, a, b, c, optionalTarget ) {
- v0.subVectors( c, a );
- v1.subVectors( b, a );
- v2.subVectors( point, a );
- var dot00 = v0.dot( v0 );
- var dot01 = v0.dot( v1 );
- var dot02 = v0.dot( v2 );
- var dot11 = v1.dot( v1 );
- var dot12 = v1.dot( v2 );
- var denom = ( dot00 * dot11 - dot01 * dot01 );
- var result = optionalTarget || new THREE.Vector3();
- // colinear or singular triangle
- if( denom == 0 ) {
- // arbitrary location outside of triangle?
- // not sure if this is the best idea, maybe should be returning undefined
- return result.set( -2, -1, -1 );
- }
- var invDenom = 1 / denom;
- var u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;
- var v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;
- // barycoordinates must always sum to 1
- return result.set( 1 - u - v, v, u );
- };
- }();
- THREE.Triangle.containsPoint = function() {
- var v1 = new THREE.Vector3();
- return function ( point, a, b, c ) {
- var result = THREE.Triangle.barycoordFromPoint( point, a, b, c, v1 );
- return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );
- };
- }();
- THREE.extend( THREE.Triangle.prototype, {
- constructor: THREE.Triangle,
- set: function ( a, b, c ) {
- this.a.copy( a );
- this.b.copy( b );
- this.c.copy( c );
- return this;
- },
- setFromPointsAndIndices: function ( points, i0, i1, i2 ) {
- this.a.copy( points[i0] );
- this.b.copy( points[i1] );
- this.c.copy( points[i2] );
- return this;
- },
- copy: function ( triangle ) {
- this.a.copy( triangle.a );
- this.b.copy( triangle.b );
- this.c.copy( triangle.c );
- return this;
- },
- area: function() {
- var v0 = new THREE.Vector3(),
- v1 = new THREE.Vector3();
-
- return function () {
- v0.subVectors( this.c, this.b );
- v1.subVectors( this.a, this.b );
- return v0.cross( v1 ).length() * 0.5;
- };
- }(),
- midpoint: function ( optionalTarget ) {
- var result = optionalTarget || new THREE.Vector3();
- return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );
- },
- normal: function ( optionalTarget ) {
- return THREE.Triangle.normal( this.a, this.b, this.c, optionalTarget );
- },
- plane: function ( optionalTarget ) {
- var result = optionalTarget || new THREE.Plane();
- return result.setFromCoplanarPoints( this.a, this.b, this.c );
- },
- barycoordFromPoint: function ( point, optionalTarget ) {
- return THREE.Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );
- },
- containsPoint: function ( point ) {
- return THREE.Triangle.containsPoint( point, this.a, this.b, this.c );
- },
- equals: function ( triangle ) {
- return triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );
- },
- clone: function () {
- return new THREE.Triangle().copy( this );
- }
- } );
|