mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-06-09 19:50:50 -04:00
Change Curve#[getPoint / getTangent / getNormal](t) to #[getPoint / getTangent / getNormal](offset, isParamter).
Keep deprecated versions around for now.
This commit is contained in:
parent
e75ee18de1
commit
1a438b8b9b
5 changed files with 99 additions and 85 deletions
examples/Scripts
src/path
|
@ -41,7 +41,7 @@
|
|||
var t = iteratively
|
||||
? curve.getParameterAt(step, prev)
|
||||
: curve.getParameterAt(pos);
|
||||
var point = curve.getPoint(t);
|
||||
var point = curve.getPointAt(t, true);
|
||||
var circle = new Path.Circle(point, step / 2);
|
||||
circle.strokeColor = 'red';
|
||||
if (remove)
|
||||
|
|
|
@ -262,71 +262,6 @@ var Curve = this.Curve = Base.extend(/** @lends Curve# */{
|
|||
&& this._segment2._handleIn.isZero();
|
||||
},
|
||||
|
||||
// DOCS: Document #getParameterAt(offset, start)
|
||||
// DOCS: Document #getParameterOf(point)
|
||||
// DOCS: Document #getLocationAt(offset, isParameter)
|
||||
// DOCS: Document #getLocationOf(point)
|
||||
/**
|
||||
* @param {Number} offset
|
||||
* @param {Number} [start]
|
||||
* @return {Number}
|
||||
*/
|
||||
getParameterAt: function(offset, start) {
|
||||
return Curve.getParameterAt(this.getValues(), offset,
|
||||
start !== undefined ? start : offset < 0 ? 1 : 0);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Point} point
|
||||
* @return {Number}
|
||||
*/
|
||||
getParameterOf: function(point) {
|
||||
point = Point.read(arguments);
|
||||
return Curve.getParameterOf(this.getValues(), point.x, point.y);
|
||||
},
|
||||
|
||||
getLocationAt: function(offset, isParameter) {
|
||||
if (!isParameter)
|
||||
offset = this.getParameterAt(offset);
|
||||
return new CurveLocation(this, offset);
|
||||
},
|
||||
|
||||
getLocationOf: function(point) {
|
||||
var t = this.getParameterOf.apply(this, arguments);
|
||||
return t != null ? new CurveLocation(this, t) : null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the point on the curve at the specified position.
|
||||
*
|
||||
* @param {Number} parameter the position at which to find the point as
|
||||
* a value between {@code 0} and {@code 1}.
|
||||
* @return {Point}
|
||||
*/
|
||||
getPoint: function(parameter) {
|
||||
return Curve.evaluate(this.getValues(), parameter, 0);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the tangent point on the curve at the specified position.
|
||||
*
|
||||
* @param {Number} parameter the position at which to find the tangent
|
||||
* point as a value between {@code 0} and {@code 1}.
|
||||
*/
|
||||
getTangent: function(parameter) {
|
||||
return Curve.evaluate(this.getValues(), parameter, 1);
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns the normal point on the curve at the specified position.
|
||||
*
|
||||
* @param {Number} parameter the position at which to find the normal
|
||||
* point as a value between {@code 0} and {@code 1}.
|
||||
*/
|
||||
getNormal: function(parameter) {
|
||||
return Curve.evaluate(this.getValues(), parameter, 2);
|
||||
},
|
||||
|
||||
getIntersections: function(curve) {
|
||||
return Curve._addIntersections(this.getValues(), curve.getValues(),
|
||||
this, []);
|
||||
|
@ -342,15 +277,15 @@ var Curve = this.Curve = Base.extend(/** @lends Curve# */{
|
|||
crossings = 0;
|
||||
for (var i = 0; i < count; i++) {
|
||||
var t = roots[i];
|
||||
if (t >= 0 && t < 1 && Curve.evaluate(vals, t, 0).x > point.x) {
|
||||
if (t >= 0 && t < 1 && Curve.evaluate(vals, t, true, 0).x > point.x) {
|
||||
// If we're close to 0 and are not changing y-direction from the
|
||||
// previous curve, do not count this root, as we're merely
|
||||
// touching a tip. Passing 1 for Curve.evaluate()'s type means
|
||||
// we're calculating tangents, and then check their y-slope for
|
||||
// a change of direction:
|
||||
if (t < /*#=*/ Numerical.TOLERANCE
|
||||
&& Curve.evaluate(this.getPrevious().getValues(), 1, 1).y
|
||||
* Curve.evaluate(vals, t, 1).y
|
||||
&& Curve.evaluate(this.getPrevious().getValues(), 1, true, 1).y
|
||||
* Curve.evaluate(vals, t, true, 1).y
|
||||
>= /*#=*/ Numerical.TOLERANCE)
|
||||
continue;
|
||||
crossings++;
|
||||
|
@ -486,8 +421,9 @@ statics: {
|
|||
];
|
||||
},
|
||||
|
||||
evaluate: function(v, t, type) {
|
||||
var p1x = v[0], p1y = v[1],
|
||||
evaluate: function(v, offset, isParameter, type) {
|
||||
var t = isParameter ? offset : Curve.getParameterAt(v, offset, 0),
|
||||
p1x = v[0], p1y = v[1],
|
||||
c1x = v[2], c1y = v[3],
|
||||
c2x = v[4], c2y = v[5],
|
||||
p2x = v[6], p2y = v[7],
|
||||
|
@ -752,7 +688,85 @@ statics: {
|
|||
}
|
||||
return locations;
|
||||
}
|
||||
}}, Base.each(['getBounds', 'getStrokeBounds', 'getHandleBounds', 'getRoughBounds'],
|
||||
}}, Base.each(['getPoint', 'getTangent', 'getNormal'],
|
||||
// Note: Although Curve.getBounds() exists, we are using Path.getBounds() to
|
||||
// determine the bounds of Curve objects with defined segment1 and segment2
|
||||
// values Curve.getBounds() can be used directly on curve arrays, without
|
||||
// the need to create a Curve object first, as required by the code that
|
||||
// finds path interesections.
|
||||
function(name, index) {
|
||||
this[name + 'At'] = function(offset, isParameter) {
|
||||
return Curve.evaluate(this.getValues(), offset, isParameter, index);
|
||||
};
|
||||
// Deprecated and undocumented, but keep around for now.
|
||||
// TODO: Remove once enough time has passed (28.01.2013)
|
||||
this[name] = function(parameter) {
|
||||
return Curve.evaluate(this.getValues(), parameter, true, index);
|
||||
};
|
||||
},
|
||||
/** @lends Curve# */{
|
||||
// DOCS: Document #getParameterAt(offset, start)
|
||||
// DOCS: Document #getParameterOf(point)
|
||||
// DOCS: Document #getLocationAt(offset, isParameter)
|
||||
// DOCS: Document #getLocationOf(point)
|
||||
/**
|
||||
* @param {Number} offset
|
||||
* @param {Number} [start]
|
||||
* @return {Number}
|
||||
*/
|
||||
getParameterAt: function(offset, start) {
|
||||
return Curve.getParameterAt(this.getValues(), offset,
|
||||
start !== undefined ? start : offset < 0 ? 1 : 0);
|
||||
},
|
||||
|
||||
/**
|
||||
* @param {Point} point
|
||||
* @return {Number}
|
||||
*/
|
||||
getParameterOf: function(point) {
|
||||
point = Point.read(arguments);
|
||||
return Curve.getParameterOf(this.getValues(), point.x, point.y);
|
||||
},
|
||||
|
||||
getLocationAt: function(offset, isParameter) {
|
||||
if (!isParameter)
|
||||
offset = this.getParameterAt(offset);
|
||||
return new CurveLocation(this, offset);
|
||||
},
|
||||
|
||||
getLocationOf: function(point) {
|
||||
var t = this.getParameterOf.apply(this, arguments);
|
||||
return t != null ? new CurveLocation(this, t) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the point on the curve at the specified position.
|
||||
*
|
||||
* @name Curve#getPointAt
|
||||
* @function
|
||||
* @param {Number} parameter the position at which to find the point as
|
||||
* a value between {@code 0} and {@code 1}.
|
||||
* @return {Point}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns the tangent point on the curve at the specified position.
|
||||
*
|
||||
* @name Curve#getTangentAt
|
||||
* @function
|
||||
* @param {Number} parameter the position at which to find the tangent
|
||||
* point as a value between {@code 0} and {@code 1}.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns the normal point on the curve at the specified position.
|
||||
*
|
||||
* @name Curve#getNormalAt
|
||||
* @function
|
||||
* @param {Number} parameter the position at which to find the normal
|
||||
* point as a value between {@code 0} and {@code 1}.
|
||||
*/
|
||||
}), Base.each(['getBounds', 'getStrokeBounds', 'getHandleBounds', 'getRoughBounds'],
|
||||
// Note: Although Curve.getBounds() exists, we are using Path.getBounds() to
|
||||
// determine the bounds of Curve objects with defined segment1 and segment2
|
||||
// values Curve.getBounds() can be used directly on curve arrays, without
|
||||
|
@ -1069,7 +1083,7 @@ new function() { // Scope for methods that require numerical integration
|
|||
minPoint;
|
||||
// There are always roots, since we add [0, 1] above.
|
||||
for (var i = 0; i < roots.length; i++) {
|
||||
var pt = this.getPoint(roots[i]),
|
||||
var pt = this.getPointAt(roots[i], true),
|
||||
dist = point.getDistance(pt, true);
|
||||
// We're comparing squared distances
|
||||
if (dist < minDist) {
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
* {@link Path#curves} array is also provided.
|
||||
*
|
||||
* The class is in use in many places, such as
|
||||
* {@link Path#getLocationAt(offset)},
|
||||
* {@link Path#getLocationAt(offset, isParameter)},
|
||||
* {@link Path#getLocationOf(point)},
|
||||
* {@link Path#getNearestLocation(point),
|
||||
* {@link PathItem#getIntersections(path)},
|
||||
|
@ -173,7 +173,7 @@ CurveLocation = Base.extend(/** @lends CurveLocation# */{
|
|||
getPoint: function() {
|
||||
if (!this._point && this._parameter != null) {
|
||||
var curve = this.getCurve();
|
||||
this._point = curve && curve.getPoint(this._parameter);
|
||||
this._point = curve && curve.getPointAt(this._parameter, true);
|
||||
}
|
||||
return this._point;
|
||||
},
|
||||
|
@ -187,7 +187,7 @@ CurveLocation = Base.extend(/** @lends CurveLocation# */{
|
|||
getTangent: function() {
|
||||
var parameter = this.getParameter(),
|
||||
curve = this.getCurve();
|
||||
return parameter != null && curve && curve.getTangent(parameter);
|
||||
return parameter != null && curve && curve.getTangentAt(parameter, true);
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -199,7 +199,7 @@ CurveLocation = Base.extend(/** @lends CurveLocation# */{
|
|||
getNormal: function() {
|
||||
var parameter = this.getParameter(),
|
||||
curve = this.getCurve();
|
||||
return parameter != null && curve && curve.getNormal(parameter);
|
||||
return parameter != null && curve && curve.getNormalAt(parameter, true);
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
@ -2055,8 +2055,8 @@ statics: {
|
|||
}
|
||||
|
||||
function addBevelJoin(curve, t) {
|
||||
var point = curve.getPoint(t),
|
||||
normal = curve.getNormal(t).normalize(radius);
|
||||
var point = curve.getPointAt(t, true),
|
||||
normal = curve.getNormalAt(t, true).normalize(radius);
|
||||
add(point.add(normal));
|
||||
add(point.subtract(normal));
|
||||
}
|
||||
|
@ -2075,9 +2075,9 @@ statics: {
|
|||
} else if (join == 'miter') {
|
||||
var curve2 = segment.getCurve(),
|
||||
curve1 = curve2.getPrevious(),
|
||||
point = curve2.getPoint(0),
|
||||
normal1 = curve1.getNormal(1).normalize(radius),
|
||||
normal2 = curve2.getNormal(0).normalize(radius),
|
||||
point = curve2.getPointAt(0, true),
|
||||
normal1 = curve1.getNormalAt(1, true).normalize(radius),
|
||||
normal2 = curve2.getNormalAt(0, true).normalize(radius),
|
||||
// Intersect the two lines
|
||||
line1 = new Line(point.subtract(normal1),
|
||||
Point.create(-normal1.y, normal1.x)),
|
||||
|
@ -2102,8 +2102,8 @@ statics: {
|
|||
case 'square':
|
||||
// Calculate the corner points of butt and square caps
|
||||
var curve = segment.getCurve(),
|
||||
point = curve.getPoint(t),
|
||||
normal = curve.getNormal(t).normalize(radius);
|
||||
point = curve.getPointAt(t, true),
|
||||
normal = curve.getNormalAt(t, true).normalize(radius);
|
||||
// For square caps, we need to step away from point in the
|
||||
// direction of the tangent, which is the rotated normal
|
||||
if (cap === 'square')
|
||||
|
|
|
@ -116,7 +116,7 @@ var PathFlattener = Base.extend({
|
|||
|
||||
evaluate: function(offset, type) {
|
||||
var param = this.getParameterAt(offset);
|
||||
return Curve.evaluate(this.curves[param.index], param.value, type);
|
||||
return Curve.evaluate(this.curves[param.index], param.value, true, type);
|
||||
},
|
||||
|
||||
drawPart: function(ctx, from, to) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue