|
|
@@ -196,124 +196,86 @@ THREE.ExtrudeGeometry.prototype.addShape = function ( shape, options ) {
|
|
|
var RAD_TO_DEGREES = 180 / Math.PI;
|
|
|
|
|
|
|
|
|
- function getBevelVec( pt_i, pt_j, pt_k ) {
|
|
|
-
|
|
|
- // Algorithm 2
|
|
|
-
|
|
|
- return getBevelVec2( pt_i, pt_j, pt_k );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- function getBevelVec1( pt_i, pt_j, pt_k ) {
|
|
|
-
|
|
|
- var anglea = Math.atan2( pt_j.y - pt_i.y, pt_j.x - pt_i.x );
|
|
|
- var angleb = Math.atan2( pt_k.y - pt_i.y, pt_k.x - pt_i.x );
|
|
|
-
|
|
|
- if ( anglea > angleb ) {
|
|
|
-
|
|
|
- angleb += Math.PI * 2;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- var anglec = ( anglea + angleb ) / 2;
|
|
|
-
|
|
|
-
|
|
|
- //console.log('angle1', anglea * RAD_TO_DEGREES,'angle2', angleb * RAD_TO_DEGREES, 'anglec', anglec *RAD_TO_DEGREES);
|
|
|
-
|
|
|
- var x = - Math.cos( anglec );
|
|
|
- var y = - Math.sin( anglec );
|
|
|
-
|
|
|
- var vec = new THREE.Vector2( x, y ); //.normalize();
|
|
|
-
|
|
|
- return vec;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- function getBevelVec2( pt_i, pt_j, pt_k ) {
|
|
|
-
|
|
|
- var a = THREE.ExtrudeGeometry.__v1,
|
|
|
- b = THREE.ExtrudeGeometry.__v2,
|
|
|
- v_hat = THREE.ExtrudeGeometry.__v3,
|
|
|
- w_hat = THREE.ExtrudeGeometry.__v4,
|
|
|
- p = THREE.ExtrudeGeometry.__v5,
|
|
|
- q = THREE.ExtrudeGeometry.__v6,
|
|
|
- v, w,
|
|
|
- v_dot_w_hat, q_sub_p_dot_w_hat,
|
|
|
- s, intersection;
|
|
|
-
|
|
|
- // good reading for line-line intersection
|
|
|
- // http://sputsoft.com/blog/2010/03/line-line-intersection.html
|
|
|
-
|
|
|
- // define a as vector j->i
|
|
|
- // define b as vectot k->i
|
|
|
-
|
|
|
- a.set( pt_i.x - pt_j.x, pt_i.y - pt_j.y );
|
|
|
- b.set( pt_i.x - pt_k.x, pt_i.y - pt_k.y );
|
|
|
-
|
|
|
- // get unit vectors
|
|
|
-
|
|
|
- v = a.normalize();
|
|
|
- w = b.normalize();
|
|
|
-
|
|
|
- // normals from pt i
|
|
|
-
|
|
|
- v_hat.set( -v.y, v.x );
|
|
|
- w_hat.set( w.y, -w.x );
|
|
|
-
|
|
|
- // pts from i
|
|
|
-
|
|
|
- p.copy( pt_i ).add( v_hat );
|
|
|
- q.copy( pt_i ).add( w_hat );
|
|
|
-
|
|
|
- if ( p.equals( q ) ) {
|
|
|
-
|
|
|
- //console.log("Warning: lines are straight");
|
|
|
- return w_hat.clone();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // Points from j, k. helps prevents points cross overover most of the time
|
|
|
-
|
|
|
- p.copy( pt_j ).add( v_hat );
|
|
|
- q.copy( pt_k ).add( w_hat );
|
|
|
-
|
|
|
- v_dot_w_hat = v.dot( w_hat );
|
|
|
- q_sub_p_dot_w_hat = q.sub( p ).dot( w_hat );
|
|
|
-
|
|
|
- // We should not reach these conditions
|
|
|
-
|
|
|
- if ( v_dot_w_hat === 0 ) {
|
|
|
-
|
|
|
- console.log( "Either infinite or no solutions!" );
|
|
|
-
|
|
|
- if ( q_sub_p_dot_w_hat === 0 ) {
|
|
|
-
|
|
|
- console.log( "Its finite solutions." );
|
|
|
-
|
|
|
+ function getBevelVec( inPt, inPrev, inNext ) {
|
|
|
+ var EPSILON = 0.0000000001;
|
|
|
+
|
|
|
+ // computes for inPt the corresponding point inPt' on a new contour
|
|
|
+ // shiftet by 1 unit (length of normalized vector) to the left
|
|
|
+ // if we walk along contour clockwise, this new contour is outside the old one
|
|
|
+ //
|
|
|
+ // inPt' is the intersection of the two lines parallel to the two
|
|
|
+ // adjacent edges of inPt at a distance of 1 unit on the left side.
|
|
|
+
|
|
|
+ var v_trans_x, v_trans_y, shrink_by = 1; // resulting translation vector for inPt
|
|
|
+
|
|
|
+ // good reading for geometry algorithms (here: line-line intersection)
|
|
|
+ // http://geomalgorithms.com/a05-_intersect-1.html
|
|
|
+
|
|
|
+ var v_prev_x = inPt.x - inPrev.x, v_prev_y = inPt.y - inPrev.y;
|
|
|
+ var v_next_x = inNext.x - inPt.x, v_next_y = inNext.y - inPt.y;
|
|
|
+
|
|
|
+ var v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );
|
|
|
+
|
|
|
+ // check for colinear edges
|
|
|
+ var colinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );
|
|
|
+
|
|
|
+ if ( Math.abs( colinear0 ) > EPSILON ) { // not colinear
|
|
|
+
|
|
|
+ // length of vectors for normalizing
|
|
|
+
|
|
|
+ var v_prev_len = Math.sqrt( v_prev_lensq );
|
|
|
+ var v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );
|
|
|
+
|
|
|
+ // shift adjacent points by unit vectors to the left
|
|
|
+
|
|
|
+ var ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );
|
|
|
+ var ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );
|
|
|
+
|
|
|
+ var ptNextShift_x = ( inNext.x - v_next_y / v_next_len );
|
|
|
+ var ptNextShift_y = ( inNext.y + v_next_x / v_next_len );
|
|
|
+
|
|
|
+ // scaling factor for v_prev to intersection point
|
|
|
+
|
|
|
+ var sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -
|
|
|
+ ( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /
|
|
|
+ ( v_prev_x * v_next_y - v_prev_y * v_next_x );
|
|
|
+
|
|
|
+ // vector from inPt to intersection point
|
|
|
+
|
|
|
+ v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );
|
|
|
+ v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );
|
|
|
+
|
|
|
+ // Don't normalize!, otherwise sharp corners become ugly
|
|
|
+ // but prevent crazy spikes
|
|
|
+ var v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y )
|
|
|
+ if ( v_trans_lensq <= 2 ) {
|
|
|
+ return new THREE.Vector2( v_trans_x, v_trans_y );
|
|
|
} else {
|
|
|
-
|
|
|
- console.log( "Too bad, no solutions." );
|
|
|
-
|
|
|
+ shrink_by = Math.sqrt( v_trans_lensq / 2 );
|
|
|
+ }
|
|
|
+
|
|
|
+ } else { // handle special case of colinear edges
|
|
|
+
|
|
|
+ if ( ( ( v_prev_x != 0 ) && ( Math.sign(v_prev_x) != Math.sign(v_next_x) ) ) ||
|
|
|
+ ( ( v_prev_x == 0 ) && ( Math.sign(v_prev_y) != Math.sign(v_next_y) ) ) ) {
|
|
|
+ // console.log("Warning: lines are a straight spike");
|
|
|
+ v_trans_x = v_prev_x;
|
|
|
+ v_trans_y = v_prev_y;
|
|
|
+ shrink_by = Math.sqrt( v_prev_lensq / 2 );
|
|
|
+ } else {
|
|
|
+ // console.log("Warning: lines are a straight sequence");
|
|
|
+ v_trans_x = -v_prev_y;
|
|
|
+ v_trans_y = v_prev_x;
|
|
|
+ shrink_by = Math.sqrt( v_prev_lensq );
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- s = q_sub_p_dot_w_hat / v_dot_w_hat;
|
|
|
-
|
|
|
- if ( s < 0 ) {
|
|
|
-
|
|
|
- // in case of emergecy, revert to algorithm 1.
|
|
|
-
|
|
|
- return getBevelVec1( pt_i, pt_j, pt_k );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- intersection = v.multiplyScalar( s ).add( p );
|
|
|
-
|
|
|
- return intersection.sub( pt_i ).clone(); // Don't normalize!, otherwise sharp corners become ugly
|
|
|
+ return new THREE.Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
var contourMovements = [];
|
|
|
|
|
|
for ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
|