mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-08 05:42:07 -05:00
Improve Line.intersect() to more reliably find interesctions at the beginnings / ends.
Relates to #784
This commit is contained in:
parent
53ff973f06
commit
75a004187e
3 changed files with 19 additions and 8 deletions
|
@ -133,14 +133,25 @@ var Line = Base.extend(/** @lends Line# */{
|
||||||
if (!Numerical.isZero(cross)) {
|
if (!Numerical.isZero(cross)) {
|
||||||
var dx = p1x - p2x,
|
var dx = p1x - p2x,
|
||||||
dy = p1y - p2y,
|
dy = p1y - p2y,
|
||||||
t1 = (v2x * dy - v2y * dx) / cross,
|
u1 = (v2x * dy - v2y * dx) / cross,
|
||||||
t2 = (v1x * dy - v1y * dx) / cross;
|
u2 = (v1x * dy - v1y * dx) / cross,
|
||||||
|
// Compare the u values with EPSILON tolerance over the
|
||||||
|
// [0, 1] bounds.
|
||||||
|
uMin = -/*#=*/Numerical.EPSILON,
|
||||||
|
uMax = 1 + uMin;
|
||||||
// Check the ranges of t parameters if the line is not allowed
|
// Check the ranges of t parameters if the line is not allowed
|
||||||
// to extend beyond the definition points.
|
// to extend beyond the definition points.
|
||||||
if (isInfinite || 0 <= t1 && t1 <= 1 && 0 <= t2 && t2 <= 1)
|
if (isInfinite
|
||||||
|
|| uMin < u1 && u1 < uMax && uMin < u2 && u2 < uMax) {
|
||||||
|
if (!isInfinite) {
|
||||||
|
// Address the tolerance at the bounds by clipping to
|
||||||
|
// the actual range.
|
||||||
|
u1 = u1 < 0 ? 0 : u1 > 1 ? 1 : u1;
|
||||||
|
}
|
||||||
return new Point(
|
return new Point(
|
||||||
p1x + t1 * v1x,
|
p1x + u1 * v1x,
|
||||||
p1y + t1 * v1y);
|
p1y + u1 * v1y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -1379,11 +1379,11 @@ new function() { // Scope for intersection using bezier fat-line clipping
|
||||||
// which connects back to the beginning, but only if it's not part of
|
// which connects back to the beginning, but only if it's not part of
|
||||||
// a found overlap. The normal intersection will already be found at
|
// a found overlap. The normal intersection will already be found at
|
||||||
// the beginning, and would be added twice otherwise.
|
// the beginning, and would be added twice otherwise.
|
||||||
if (t1 >= (startConnected ? tMin : 0) &&
|
if (t1 !== null && t1 >= (startConnected ? tMin : 0) &&
|
||||||
t1 <= (endConnected ? tMax : 1)) {
|
t1 <= (endConnected ? tMax : 1)) {
|
||||||
if (t2 == null)
|
if (t2 == null)
|
||||||
t2 = Curve.getParameterOf(v2, p2.x, p2.y);
|
t2 = Curve.getParameterOf(v2, p2.x, p2.y);
|
||||||
if (t2 >= (endConnected ? tMin : 0) &&
|
if (t2 !== null && t2 >= (endConnected ? tMin : 0) &&
|
||||||
t2 <= (startConnected ? tMax : 1)) {
|
t2 <= (startConnected ? tMax : 1)) {
|
||||||
// TODO: Don't we need to check the range of t2 as well? Does it
|
// TODO: Don't we need to check the range of t2 as well? Does it
|
||||||
// also need startConnected / endConnected values?
|
// also need startConnected / endConnected values?
|
||||||
|
|
|
@ -112,7 +112,7 @@ var Numerical = new function() {
|
||||||
KAPPA: 4 * (sqrt(2) - 1) / 3,
|
KAPPA: 4 * (sqrt(2) - 1) / 3,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the value is 0, within a tolerance defined by
|
* Checks if the value is 0, within a tolerance defined by
|
||||||
* Numerical.EPSILON.
|
* Numerical.EPSILON.
|
||||||
*/
|
*/
|
||||||
isZero: function(val) {
|
isZero: function(val) {
|
||||||
|
|
Loading…
Reference in a new issue