mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-06 04:42:15 -05:00
Implement a faster method to filter out beginnings of intersected curves.
This commit is contained in:
parent
a9a0857ba4
commit
7f245974e6
2 changed files with 9 additions and 8 deletions
|
@ -69,7 +69,7 @@ var Line = this.Line = Base.extend(/** @lends Line# */{
|
||||||
* @param {Line} line
|
* @param {Line} line
|
||||||
* @return {Point} the intersection point of the lines
|
* @return {Point} the intersection point of the lines
|
||||||
*/
|
*/
|
||||||
intersect: function(line) {
|
intersect: function(line, excludeStart, excludeEnd) {
|
||||||
var cross = this.vector.cross(line.vector);
|
var cross = this.vector.cross(line.vector);
|
||||||
// Avoid divisions by 0, and errors when getting too close to 0
|
// Avoid divisions by 0, and errors when getting too close to 0
|
||||||
if (Numerical.isZero(cross))
|
if (Numerical.isZero(cross))
|
||||||
|
@ -79,8 +79,10 @@ var Line = this.Line = Base.extend(/** @lends Line# */{
|
||||||
t2 = v.cross(this.vector) / cross;
|
t2 = v.cross(this.vector) / cross;
|
||||||
// Check the ranges of t parameters if the line is not allowed to
|
// Check the ranges of t parameters if the line is not allowed to
|
||||||
// extend beyond the definition points.
|
// extend beyond the definition points.
|
||||||
return (this.infinite || 0 <= t1 && t1 <= 1)
|
return (this.infinite || (excludeStart ? 0 < t1 : 0 <= t1)
|
||||||
&& (line.infinite || 0 <= t2 && t2 <= 1)
|
&& (excludeEnd ? t1 < 1 : t1 <= 1))
|
||||||
|
&& (line.infinite || (excludeStart ? 0 < t2 : 0 <= t2)
|
||||||
|
&& (excludeEnd ? t2 < 1 : t2 <= 1))
|
||||||
? this.point.add(this.vector.multiply(t1)) : null;
|
? this.point.add(this.vector.multiply(t1)) : null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -667,11 +667,10 @@ statics: {
|
||||||
// See if the parametric equations of the lines interesct.
|
// See if the parametric equations of the lines interesct.
|
||||||
var line1 = new Line(v1[0], v1[1], v1[6], v1[7], false),
|
var line1 = new Line(v1[0], v1[1], v1[6], v1[7], false),
|
||||||
line2 = new Line(v2[0], v2[1], v2[6], v2[7], false),
|
line2 = new Line(v2[0], v2[1], v2[6], v2[7], false),
|
||||||
point = line1.intersect(line2);
|
// Filter out beginnings of the curves, to avoid duplicate
|
||||||
// Filter out beginnings of the curves, to avoid duplicate
|
// solutions where curves join.
|
||||||
// solutions where curves join.
|
point = line1.intersect(line2, true, false);
|
||||||
if (point && !point.equals(line1.point)
|
if (point)
|
||||||
&& !point.equals(line2.point))
|
|
||||||
// Passing null for parameter leads to lazy determination of
|
// Passing null for parameter leads to lazy determination of
|
||||||
// parameter values in CurveLocation#getParameter() only
|
// parameter values in CurveLocation#getParameter() only
|
||||||
// once they are requested.
|
// once they are requested.
|
||||||
|
|
Loading…
Reference in a new issue