Browse Source

Bevel version 3a failed

zz85 14 years ago
parent
commit
547afeb332
1 changed files with 131 additions and 21 deletions
  1. 131 21
      src/extras/geometries/ExtrudeGeometry.js

+ 131 - 21
src/extras/geometries/ExtrudeGeometry.js

@@ -154,7 +154,10 @@ THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 		return vectorFromCentroid.multiplyScalar( adj ).addSelf( centroid );
 		return vectorFromCentroid.multiplyScalar( adj ).addSelf( centroid );
 	}
 	}
 	
 	
-
+	function scalePt2 (pt, vec, size ) {
+		return vec.clone().multiplyScalar( size ).addSelf( pt );
+	}
+	
 
 
 	var i,
 	var i,
 		vert, vlen = vertices.length,
 		vert, vlen = vertices.length,
@@ -165,33 +168,148 @@ THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 
 
 	var bs;
 	var bs;
 	
 	
+	//------
+	// Find directions for point movement
+	//
+	
+	var RAD_TO_DEGREES = 180 / Math.PI;
+
+	
+	function getBevelVec(u, v /*Vector2*/) {
+		console.log(u,v);
+		//u = u.normalize();
+		//v = v.normalize();
+		var scalar = u.dot(v);
+		var product = u.length() * v.length();
+		// scalar = product * cos (theta)
+		
+		var theta = Math.acos( scalar / product );
+		
+		console.log('theta', theta * RAD_TO_DEGREES);
+		
+		var angle = Math.PI *2 - theta / 2;
+		angle /= 2;
+		
+		var uw = u.length() * bevelSize * Math.cos(angle);
+		var wv = bevelSize * v.length() * Math.cos(angle);
+		// ax + by = c
+		// dx + ey = d
+		
+			console.log('uw', uw, 'wv', wv);
+		
+		var a = u.x, b = u.y, c = uw,
+			d = v.x, e = v.y, f = wv;
+			
+		var y = (f - c) / (e - b);
+		var x = (f - c) / (d - a);
+		
+		
+		var vec3 = new THREE.Vector2(x, y).normalize();
+		console.log('xy', x, y, vec3);
+		return vec3;
+	}
+	
+	var contourMovements = [];
+	
+	for ( i = 0, il = contour.length, j = il-1, k = i + 1; i < il; i++,j++,k++ ) {
+		if (j==il) j = 0;
+		if (k==il) k = 0;
+		
+		//  (j)---(i)---(k)
+		console.log('i,j,k', i, j , k)
+		var v1 = contour[ j ].clone().subSelf(contour[ i ]); //.normalize();
+		var v2 = contour[ k ].clone().subSelf(contour[ i ]); //.normalize();
+		
+		//var v1 = contour[ i ].clone().subSelf(contour[ j ]);
+		//var v2 = contour[ k ].clone().subSelf(contour[ i ]);
+		
+		var pt_i = contour[ i ];
+		var pt_j = contour[ j ];
+		var pt_k = contour[ k ];
+		
+		console.log(pt_i, pt_j, pt_k);
+		
+		var anglea = Math.atan2(pt_i.y - pt_j.y, pt_i.x - pt_j.x);
+		//var angleb = Math.atan2(pt_k.y - pt_i.y, pt_k.x - pt_i.x);
+		var angleb = Math.atan2(pt_i.y - pt_k.y, pt_i.x - pt_k.x);
+		
+		var anglec = (angleb - anglea ) / 2 + anglea;
+		
+		console.log('angle1', anglea * RAD_TO_DEGREES,'angle2', angleb * RAD_TO_DEGREES, 'anglec', anglec *RAD_TO_DEGREES);
+		
+		x = -bevelSize * Math.cos(anglec);
+		y = -bevelSize * Math.sin(anglec);
+		
+		contourMovements[i]= new THREE.Vector2(x,y).normalize();
+		console.log('xy', x, y, contourMovements[i], pt_i.x +x , pt_i.y + y);
+		
+		//contourMovements[i]= getBevelVec(v1, v2);
+		
+		
+	}
+	
+	var holesMovements = [], oneHoleMovements;
+	// expand holes
+	for ( h = 0, hl = holes.length; h < hl; h++ ) {
+
+		ahole = holes[h];
+		
+		oneHoleMovements = [];
+		
+		for ( i = 0, il = ahole.length, j = il-1, k = i + 1; i < il; i++,j++,k++ ) {
+			if (j==il) j = 0;
+			if (k==il) k = 0;
+
+			//  (j)---(i)---(k)
+
+			var v1 = ahole[ i ].clone().subSelf(ahole[ j ]);
+			var v2 = ahole[ k ].clone().subSelf(ahole[ i ]);
+
+			oneHoleMovements[i]= getBevelVec(v1, v2);
+
+
+		}
+		
+		holesMovements.push(oneHoleMovements);
+
+	}
+	
+	
+	
 	// Loop bevelSegments, 1 for the front, 1 for the back
 	// Loop bevelSegments, 1 for the front, 1 for the back
 	
 	
 	for (b=bevelSegments; b > 0; b--) {
 	for (b=bevelSegments; b > 0; b--) {
 		t =  b / bevelSegments;
 		t =  b / bevelSegments;
 		z = bevelThickness * t;
 		z = bevelThickness * t;
 		// Formula could probably be simplified
 		// Formula could probably be simplified
-		bs = bevelSize * (1-Math.sin ((1-t) * Math.PI/2 )) ; //bevelSize * t ;
-
+		//bs = bevelSize * (1-Math.sin ((1-t) * Math.PI/2 )) ; //bevelSize * t ;
+		bs = bevelSize * t ;
+		
 		// contract shape
 		// contract shape
 		for ( i = 0, il = contour.length; i < il; i++ ) {
 		for ( i = 0, il = contour.length; i < il; i++ ) {
-			
-			vert = scalePt(contour[i], contourCentroid, bs , false);
-			v( vert.x, vert.y,  -z);
-			
+
+			vert = scalePt2(contour[i], contourMovements[i], bs);
+			v( vert.x, vert.y,  - z);
+
 		}
 		}
-		
+
 		// expand holes
 		// expand holes
 		for ( h = 0, hl = holes.length; h < hl; h++ ) {
 		for ( h = 0, hl = holes.length; h < hl; h++ ) {
-			
+
 			ahole = holes[h];
 			ahole = holes[h];
+			oneHoleMovements = holesMovements[h];
+			
 			for ( i = 0, il = ahole.length; i < il; i++ ) {
 			for ( i = 0, il = ahole.length; i < il; i++ ) {
-				vert = scalePt(ahole[i], holesCentroids[h] , bs , true);	
-				v( vert.x, vert.y,  -z);
+
+				vert = scalePt2(ahole[i], oneHoleMovements[i], bs);
+				v( vert.x, vert.y,  -z );
+
 			}
 			}
-			
+
 		}
 		}
 		
 		
+		
+		
 	}
 	}
 	
 	
 	
 	
@@ -400,15 +518,7 @@ THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 		b += shapesOffset;
 		b += shapesOffset;
 		c += shapesOffset;
 		c += shapesOffset;
 
 
-		// if ( reverse ) { // Can now be removed
-		// 
-		// 		scope.faces.push( new THREE.Face3( c, b, a ) );
-		// 
-		// 	} else {
-		// 
-		 		scope.faces.push( new THREE.Face3( a, b, c ) );
-		// 
-		// 	}
+		scope.faces.push( new THREE.Face3( a, b, c ) );
 
 
 	}
 	}