Change Curve.getParameterOf() to accept a point instead of x, y arguments.

This commit is contained in:
Jürg Lehni 2015-10-06 21:24:58 +02:00
parent 525e35518d
commit 8e4bef217a
2 changed files with 14 additions and 15 deletions

View file

@ -615,10 +615,12 @@ statics: {
return Numerical.solveCubic(a, b, c, p1 - val, roots, min, max); return Numerical.solveCubic(a, b, c, p1 - val, roots, min, max);
}, },
getParameterOf: function(v, x, y) { getParameterOf: function(v, point) {
// Handle beginnings and end separately, as they are not detected // Handle beginnings and end separately, as they are not detected
// sometimes. // sometimes.
var epsilon = /*#=*/Numerical.GEOMETRIC_EPSILON, var x = point.x,
y = point.y,
epsilon = /*#=*/Numerical.GEOMETRIC_EPSILON,
abs = Math.abs; abs = Math.abs;
if (abs(v[0] - x) < epsilon && abs(v[1] - y) < epsilon) if (abs(v[0] - x) < epsilon && abs(v[1] - y) < epsilon)
return 0; return 0;
@ -979,8 +981,7 @@ statics: {
* @return {Number} the curve time parameter of the specified point * @return {Number} the curve time parameter of the specified point
*/ */
getParameterOf: function(/* point */) { getParameterOf: function(/* point */) {
var point = Point.read(arguments); return Curve.getParameterOf(this.getValues(), Point.read(arguments));
return Curve.getParameterOf(this.getValues(), point.x, point.y);
}, },
/** /**
@ -1382,7 +1383,7 @@ new function() { // Scope for intersection using bezier fat-line clipping
tMin = /*#=*/Numerical.CURVETIME_EPSILON, tMin = /*#=*/Numerical.CURVETIME_EPSILON,
tMax = 1 - tMin; tMax = 1 - tMin;
if (t1 == null) if (t1 == null)
t1 = Curve.getParameterOf(v1, p1.x, p1.y); t1 = Curve.getParameterOf(v1, p1);
// Check t1 and t2 against correct bounds, based on start-/endConnected: // Check t1 and t2 against correct bounds, based on start-/endConnected:
// - startConnected means the start of c1 connects to the end of c2 // - startConnected means the start of c1 connects to the end of c2
// - endConneted means the end of c1 connects to the start of c2 // - endConneted means the end of c1 connects to the start of c2
@ -1393,7 +1394,7 @@ new function() { // Scope for intersection using bezier fat-line clipping
if (t1 !== null && 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);
if (t2 !== null && 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
@ -1644,7 +1645,7 @@ new function() { // Scope for intersection using bezier fat-line clipping
// the real curve and with that the location on the line. // the real curve and with that the location on the line.
var tc = roots[i], var tc = roots[i],
pc = Curve.getPoint(vc, tc), pc = Curve.getPoint(vc, tc),
tl = Curve.getParameterOf(vl, pc.x, pc.y); tl = Curve.getParameterOf(vl, pc);
if (tl !== null) { if (tl !== null) {
var pl = Curve.getPoint(vl, tl), var pl = Curve.getPoint(vl, tl),
t1 = flip ? tl : tc, t1 = flip ? tl : tc,
@ -1712,9 +1713,9 @@ new function() { // Scope for intersection using bezier fat-line clipping
for (var i = 0, t1 = 0; for (var i = 0, t1 = 0;
i < 2 && pairs.length < 2; i < 2 && pairs.length < 2;
i += t1 === 0 ? 0 : 1, t1 = t1 ^ 1) { i += t1 === 0 ? 0 : 1, t1 = t1 ^ 1) {
var t2 = Curve.getParameterOf(v[i ^ 1], var t2 = Curve.getParameterOf(v[i ^ 1], new Point(
v[i][t1 === 0 ? 0 : 6], v[i][t1 === 0 ? 0 : 6],
v[i][t1 === 0 ? 1 : 7]); v[i][t1 === 0 ? 1 : 7]));
if (t2 != null) { // If point is on curve if (t2 != null) { // If point is on curve
var pair = i === 0 ? [t1, t2] : [t2, t1]; var pair = i === 0 ? [t1, t2] : [t2, t1];
// Filter out tiny overlaps // Filter out tiny overlaps

View file

@ -584,12 +584,10 @@ PathItem.inject(new function() {
function isOverlap(seg1, seg2) { function isOverlap(seg1, seg2) {
var inter = seg2._intersection, var inter = seg2._intersection,
overlap = inter && inter._overlap; overlap = inter && inter._overlap;
if (overlap) { return overlap
var pt = Curve.getPoint(Curve.getValues(seg1, seg2), 0.5); ? Curve.getParameterOf(overlap, Curve.getPoint(
if (Curve.getParameterOf(overlap, pt.x, pt.y) !== null) Curve.getValues(seg1, seg2), 0.5)) !== null
return true; : false;
}
return false;
} }
// If there are multiple possible intersections, find the one // If there are multiple possible intersections, find the one