mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-05 20:32:00 -05:00
Address failing #isLinear() tests.
This commit is contained in:
parent
f91373efd8
commit
66717868cd
2 changed files with 25 additions and 6 deletions
|
@ -344,7 +344,9 @@ var Curve = Base.extend(/** @lends Curve# */{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if this curve appears as a straight line. This can mean that it
|
* Checks if this curve appears as a straight line. This can mean that it
|
||||||
* has no handles defined, or that the handles run collinear with the line.
|
* has no handles defined, or that the handles run collinear with the line
|
||||||
|
* that connects the curve's start and end point, not falling outside of
|
||||||
|
* the line.
|
||||||
*
|
*
|
||||||
* @return {Boolean} {@true if the curve is linear}
|
* @return {Boolean} {@true if the curve is linear}
|
||||||
* @see Segment#isLinear()
|
* @see Segment#isLinear()
|
||||||
|
@ -664,8 +666,17 @@ statics: {
|
||||||
l = new Point(p2x - p1x, p2y - p1y),
|
l = new Point(p2x - p1x, p2y - p1y),
|
||||||
h1 = new Point(v[2] - p1x, v[3] - p1y),
|
h1 = new Point(v[2] - p1x, v[3] - p1y),
|
||||||
h2 = new Point(v[4] - p2x, v[5] - p2y);
|
h2 = new Point(v[4] - p2x, v[5] - p2y);
|
||||||
return l.isZero() ? h1.isZero() && h2.isZero()
|
if (l.isZero()) {
|
||||||
: l.isCollinear(h1) && l.isCollinear(h2);
|
return h1.isZero() && h2.isZero();
|
||||||
|
} else if (h1.isCollinear(l) && h2.isCollinear(l)) {
|
||||||
|
// Get the scalar projection of h1 and h2 onto l, and make sure they
|
||||||
|
// lie within l (note that h2 is reversed)
|
||||||
|
var div = l.dot(l),
|
||||||
|
p1 = l.dot(h1) / div,
|
||||||
|
p2 = l.dot(h2) / div;
|
||||||
|
return p1 >= 0 && p1 <= 1 && p2 <= 0 && p2 >= -1;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
isFlatEnough: function(v, tolerance) {
|
isFlatEnough: function(v, tolerance) {
|
||||||
|
|
|
@ -253,7 +253,8 @@ var Segment = Base.extend(/** @lends Segment# */{
|
||||||
/**
|
/**
|
||||||
* Checks if the curve that starts in this segment appears as a straight
|
* Checks if the curve that starts in this segment appears as a straight
|
||||||
* line. This can mean that it has no handles defined, or that the handles
|
* line. This can mean that it has no handles defined, or that the handles
|
||||||
* run collinear with the line.
|
* run collinear with the line that connects the curve's start and end
|
||||||
|
* point, not falling outside of the line.
|
||||||
*
|
*
|
||||||
* @return {Boolean} {@true if the curve starting in this segment is linear}
|
* @return {Boolean} {@true if the curve starting in this segment is linear}
|
||||||
* @see Curve#isLinear()
|
* @see Curve#isLinear()
|
||||||
|
@ -572,8 +573,15 @@ var Segment = Base.extend(/** @lends Segment# */{
|
||||||
var l = seg2._point.subtract(seg1._point),
|
var l = seg2._point.subtract(seg1._point),
|
||||||
h1 = seg1._handleOut,
|
h1 = seg1._handleOut,
|
||||||
h2 = seg2._handleIn;
|
h2 = seg2._handleIn;
|
||||||
return l.isZero() ? h1.isZero() && h2.isZero()
|
if (l.isZero()) {
|
||||||
: l.isCollinear(h1) && l.isCollinear(h2);
|
return h1.isZero() && h2.isZero();
|
||||||
|
} else if (h1.isCollinear(l) && h2.isCollinear(l)) {
|
||||||
|
var div = l.dot(l),
|
||||||
|
p1 = l.dot(h1) / div,
|
||||||
|
p2 = l.dot(h2) / div;
|
||||||
|
return p1 >= 0 && p1 <= 1 && p2 <= 0 && p2 >= -1;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
isCollinear: function(seg1, seg2, seg3, seg4) {
|
isCollinear: function(seg1, seg2, seg3, seg4) {
|
||||||
|
|
Loading…
Reference in a new issue