remove old fatline code

This commit is contained in:
hkrish 2013-05-03 19:39:32 +02:00
parent 26b5003927
commit 3804531906

View file

@ -1,38 +1,5 @@
/*!
*
* Vector boolean operations on paperjs objects
* This is mostly written for clarity (I hope it is clear) and compatibility,
* not optimised for performance, and has to be tested heavily for stability.
* (Looking up to Java's Area path boolean algorithms for stability,
* but the code is too complex mainly because the operations are stored and
* enumerable, such as quadraticCurveTo, cubicCurveTo etc.; and is largely
* undocumented to directly adapt from)
*
* Supported
* - paperjs Path and CompoundPath objects
* - Boolean Union
* - Boolean Intersection
* - Boolean Subtraction
* - Resolving a self-intersecting Path
*
* Not supported yet ( which I would like to see supported )
* - Boolean operations on self-intersecting Paths, these has to be resolved first
* - Paths are clones of each other that ovelap exactly on top of each other!
*
* ------
* Harikrishnan Gopalakrishnan
* http://hkrish.com/playground/paperjs/booleanStudy.html
*
* ------
* Paperjs
* Copyright (c) 2011, Juerg Lehni & Jonathan Puckey
* http://paperjs.org/license/
*
*/
var EPSILON = 10e-12; var EPSILON = 10e-12;
var TOLERANCE = 10e-6; var TOLERANCE = 10e-6;
@ -51,8 +18,7 @@ paper.Curve.prototype._addIntersections2 = function( v1, v2, curve, locations )
function _clipFatLine( v1, v2, t1, t2, u1, u2, tdiff, udiff, tvalue, curve1, curve2, locations, count ){ function _clipFatLine( v1, v2, t1, t2, u1, u2, tdiff, udiff, tvalue, curve1, curve2, locations, count ){
if( count === undefined ) { count = 0; } if( count === undefined ) { count = 0; }
else { ++count; } else { ++count; }
if( t1 >= t2 - _tolerence && t1 <= t2 + _tolerence && if( t1 >= t2 - _tolerence && t1 <= t2 + _tolerence && u1 >= u2 - _tolerence && u1 <= u2 + _tolerence ){
u1 >= u2 - _tolerence && u1 <= u2 + _tolerence ){
var curve = tvalue ? curve2 : curve1; var curve = tvalue ? curve2 : curve1;
locations.push( new CurveLocation( curve, t1 ) ); locations.push( new CurveLocation( curve, t1 ) );
return; return;
@ -70,8 +36,8 @@ var q1 = new Point( v2[2], v2[3] ), q2 = new Point( v2[4], v2[5] );
var dmin, dmax; var dmin, dmax;
if( d1 * d2 > 0){ if( d1 * d2 > 0){
// 3/4 * min{0, d1, d2} // 3/4 * min{0, d1, d2}
dmin = 1 * Math.min( 0, d1, d2 ); dmin = 0.75 * Math.min( 0, d1, d2 );
dmax = 1 * Math.max( 0, d1, d2 ); dmax = 0.75 * Math.max( 0, d1, d2 );
} else { } else {
// 4/9 * min{0, d1, d2} // 4/9 * min{0, d1, d2}
dmin = 4 * Math.min( 0, d1, d2 ) / 9.0; dmin = 4 * Math.min( 0, d1, d2 ) / 9.0;
@ -119,11 +85,6 @@ var q1 = new Point( v2[2], v2[3] ), q2 = new Point( v2[4], v2[5] );
var tmax = Math.max( tmindmin, tmaxdmin, tmindmax, tmaxdmax ); var tmax = Math.max( tmindmin, tmaxdmin, tmindmax, tmaxdmax );
if( tmin < 0 || tmax > 1 ) { if( tmin < 0 || tmax > 1 ) {
// if( t1 >= t2 - _tolerence && t1 <= t2 + _tolerence ){
// locations.push( new CurveLocation( curve1, t1 ) );
// } else if( u1 >= u2 - _tolerence && u1 <= u2 + _tolerence ){
// locations.push( new CurveLocation( curve2, u1 ) );
// }
return; return;
} }
@ -136,13 +97,14 @@ var q1 = new Point( v2[2], v2[3] ), q2 = new Point( v2[4], v2[5] );
// We need to toggle clipping both curves alternatively // We need to toggle clipping both curves alternatively
// tvalue indicates whether to compare t or u for testing for convergence // tvalue indicates whether to compare t or u for testing for convergence
var nuV2 = Curve.getPart( v2, tmin, tmax ); var nuV2 = Curve.getPart( v2, tmin, tmax );
var convRate;
if( tvalue ){ if( tvalue ){
nuT1 = t1 + tmin * ( t2 - t1 ); nuT1 = t1 + tmin * ( t2 - t1 );
nuT2 = t1 + tmax * ( t2 - t1 ); nuT2 = t1 + tmax * ( t2 - t1 );
// Test the convergence rate // Test the convergence rate
// if the clipping fails to converge atleast 20%, // if the clipping fails to converge atleast 20%,
// subdivide the longest curve. // subdivide the longest curve.
var convRate = (tdiff - tmax + tmin ) / tdiff; convRate = (tdiff - tmax + tmin ) / tdiff;
if( convRate <= 0.2) { if( convRate <= 0.2) {
} }
@ -160,108 +122,6 @@ var q1 = new Point( v2[2], v2[3] ), q2 = new Point( v2[4], v2[5] );
} }
function _clipFatLine2( v1, v2, t1, t2, u1, u2, tdiff, udiff, tvalue, curve1, curve2, locations ){
if( t1 >= t2 - _tolerence && t1 <= t2 + _tolerence &&
u1 >= u2 - _tolerence && u1 <= u2 + _tolerence ){
locations.push( new CurveLocation( curve1, t1 ) );
return;
}
var p0 = new Point( v1[0], v1[1] ), p3 = new Point( v1[6], v1[7] );
var p1 = new Point( v1[2], v1[3] ), p2 = new Point( v1[4], v1[5] );
var q0 = new Point( v2[0], v2[1] ), q3 = new Point( v2[6], v2[7] );
var q1 = new Point( v2[2], v2[3] ), q2 = new Point( v2[4], v2[5] );
// Calculate L
var lp = new Line( p0, p3, false );
var d1 = lp.getSide( p1 ) * lp.getDistance( p1 );
var d2 = lp.getSide( p2 ) * lp.getDistance( p2 );
var dmin, dmax;
if( d1 * d2 > 0){
// 3/4 * min{0, d1, d2}
dmin = 0.75 * Math.min( 0, d1, d2 );
dmax = 0.75 * Math.max( 0, d1, d2 );
} else {
// 4/9 * min{0, d1, d2}
dmin = 4 * Math.min( 0, d1, d2 ) / 9.0;
dmax = 4 * Math.max( 0, d1, d2 ) / 9.0;
}
var dq0 = lp.getSide(q0) * lp.getDistance(q0);
var dq3 = lp.getSide(q3) * lp.getDistance(q3);
var Dt = [
[0.0, dq0],
[0.3333333333333333, lp.getSide(q1) * lp.getDistance(q1)],
[0.6666666666666666, lp.getSide(q2) * lp.getDistance(q2)],
[1.0, dq3]
];
var tmindmin = Infinity, tmaxdmin = -Infinity,
tmindmax = Infinity, tmaxdmax = -Infinity, ixd, i;
for (i = 0; i < 4; i++) {
var Dtl1 = Dt[i];
var Dtl2 = ( i === 3 )? Dt[0] : Dt[i + 1];
if( Dtl2[1] > Dtl1[1] ){
var tmp = Dtl2;
Dtl2 = Dtl1;
Dtl1 = tmp;
}
var dx = Dtl2[0] - Dtl1[0], dy = Dtl2[1] - Dtl1[1] ;
var dx_dy = ( dy !== 0 )? dx / dy : dx / ( dy + 0.0000001 );
ixd = Math.abs( Dtl1[0] + dx_dy * ( dmin - Dtl1[1] ) );
console.log( Dtl1, Dtl2, dmin, dmax, ixd, dmax >= Dtl2[1] && dmax <= Dtl1[1] )
if( dmin >= Dtl2[1] && dmin <= Dtl1[1] ){
tmindmin = ( ixd < tmindmin )? ixd : tmindmin;
tmaxdmin = ( ixd > tmaxdmin )? ixd : tmaxdmin;
}
ixd = Math.abs( Dtl1[0] + dx_dy * ( dmax - Dtl1[1] ) );
if( dmax >= Dtl2[1] && dmax <= Dtl1[1] ){
tmindmax = ( ixd < tmindmax )? ixd : tmindmax;
tmaxdmax = ( ixd > tmaxdmax )? ixd : tmaxdmax;
}
}
var tmin = Math.min( tmindmin, tmaxdmin, tmindmax, tmaxdmax );
var tmax = Math.max( tmindmin, tmaxdmin, tmindmax, tmaxdmax );
if( tmin < 0 || tmax > 1 ) {
if( t1 >= t2 - _tolerence && t1 <= t2 + _tolerence ){
locations.push( new CurveLocation( curve1, t1 ) );
} else if( u1 >= u2 - _tolerence && u1 <= u2 + _tolerence ){
locations.push( new CurveLocation( curve2, u1 ) );
}
return;
}
// We need to toggle clipping both curves alternatively
// tvalue indicates whether to compare t or u for testing for convergence
var nuV2 = Curve.getPart( v2, tmin, tmax );
if( tvalue ){
nuT1 = t1 + tmin * ( t2 - t1 );
nuT2 = t1 + tmax * ( t2 - t1 );
// Test the convergence rate
// if the clipping fails to converge atleast 20%,
// subdivide the longest curve.
var convRate = (tdiff - tmax + tmin ) / tdiff;
if( convRate <= 0.2) {
}
// console.log( nuT1, nuT2, t1, t2 );
_clipFatLine( nuV2, v1, nuT1, nuT2, u1, u2, (tmax - tmin), udiff, !tvalue, curve2, curve1, locations );
} else {
nuU1 = u1 + tmin * ( u2 - u1 );
nuU2 = u1 + tmax * ( u2 - u1 );
convRate = ( udiff - tmax + tmin ) / udiff;
// console.log( "u", nuU1, nuU2, u1, u2 );
_clipFatLine( nuV2, v1, t1, t2, nuU1, nuU2 , tdiff, (tmax - tmin), !tvalue, curve1, curve2, locations );
}
plotD_vs_t( 250, 110, Dt, dmin, dmax, tmin, tmax, 1, tvalue );
}
function drawFatline( v1 ) { function drawFatline( v1 ) {
var l = new Line( [v1[0], v1[1]], [v1[6], v1[7]], false ); var l = new Line( [v1[0], v1[1]], [v1[6], v1[7]], false );
var p1 = new Point( v1[2], v1[3] ), p2 = new Point( v1[4], v1[5] ); var p1 = new Point( v1[2], v1[3] ), p2 = new Point( v1[4], v1[5] );