2011-04-11 13:27:11 -04:00
|
|
|
/*
|
|
|
|
* Paper.js
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-04-11 13:27:11 -04:00
|
|
|
* This file is part of Paper.js, a JavaScript Vector Graphics Library,
|
|
|
|
* based on Scriptographer.org and designed to be largely API compatible.
|
|
|
|
* http://paperjs.org/
|
|
|
|
* http://scriptographer.org/
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-04-11 13:27:11 -04:00
|
|
|
* Copyright (c) 2011, Juerg Lehni & Jonathan Puckey
|
|
|
|
* http://lehni.org/ & http://jonathanpuckey.com/
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-07-01 06:17:45 -04:00
|
|
|
* Distributed under the MIT license. See LICENSE file for details.
|
|
|
|
*
|
2011-04-11 13:27:11 -04:00
|
|
|
* All rights reserved.
|
|
|
|
*/
|
|
|
|
|
2011-06-22 18:56:05 -04:00
|
|
|
/**
|
|
|
|
* @name CurveLocation
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-06-22 18:56:05 -04:00
|
|
|
* @class CurveLocation objects describe a location on {@link Curve}
|
|
|
|
* objects, as defined by the curve {@link #parameter}, a value between
|
|
|
|
* {@code 0} (beginning of the curve) and {@code 1} (end of the curve). If
|
|
|
|
* the curve is part of a {@link Path} item, its {@link #index} inside the
|
|
|
|
* {@link Path#curves} array is also provided.
|
2011-07-07 10:10:27 -04:00
|
|
|
*
|
|
|
|
* The class is in use in many places, such as
|
|
|
|
* {@link Path#getLocationAt(offset)}, Path#getNearestLocation(point), etc.
|
2011-06-22 18:56:05 -04:00
|
|
|
*/
|
|
|
|
CurveLocation = Base.extend(/** @lends CurveLocation# */{
|
2011-07-07 10:10:27 -04:00
|
|
|
// DOCS: CurveLocation class description: add these back when the mentioned
|
|
|
|
// functioned have been added: {@link Path#split(location)},
|
|
|
|
// {@link PathItem#getIntersections(path)}, etc.
|
2011-05-23 11:39:26 -04:00
|
|
|
/**
|
|
|
|
* Creates a new CurveLocation object.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-23 11:39:26 -04:00
|
|
|
* @param {Curve} curve
|
2011-05-27 15:21:49 -04:00
|
|
|
* @param {Number} parameter
|
2011-05-23 11:39:26 -04:00
|
|
|
* @param {Point} point
|
|
|
|
*/
|
2011-07-06 16:19:01 -04:00
|
|
|
initialize: function(curve, parameter, point, distance) {
|
2011-04-11 13:27:11 -04:00
|
|
|
this._curve = curve;
|
|
|
|
this._parameter = parameter;
|
|
|
|
this._point = point;
|
2011-07-06 16:19:01 -04:00
|
|
|
this._distance = distance;
|
2011-04-11 13:27:11 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The segment of the curve which is closer to the described location.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-23 11:39:26 -04:00
|
|
|
* @type Segment
|
|
|
|
* @bean
|
2011-04-11 13:27:11 -04:00
|
|
|
*/
|
|
|
|
getSegment: function() {
|
|
|
|
if (!this._segment) {
|
2011-07-08 12:39:05 -04:00
|
|
|
var curve = this._curve,
|
|
|
|
parameter = this.getParameter();
|
2011-04-11 13:27:11 -04:00
|
|
|
if (parameter == 0) {
|
2011-04-27 15:48:41 -04:00
|
|
|
this._segment = curve._segment1;
|
2011-04-11 13:27:11 -04:00
|
|
|
} else if (parameter == 1) {
|
2011-04-27 15:48:41 -04:00
|
|
|
this._segment = curve._segment2;
|
2011-05-01 08:16:25 -04:00
|
|
|
} else if (parameter == null) {
|
2011-04-11 13:27:11 -04:00
|
|
|
return null;
|
|
|
|
} else {
|
|
|
|
// Determine the closest segment by comparing curve lengths
|
2011-04-27 15:52:24 -04:00
|
|
|
this._segment = curve.getLength(0, parameter)
|
|
|
|
< curve.getLength(parameter, 1)
|
|
|
|
? curve._segment1
|
|
|
|
: curve._segment2;
|
2011-04-11 13:27:11 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return this._segment;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The curve by which the location is defined.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-23 11:39:26 -04:00
|
|
|
* @type Curve
|
|
|
|
* @bean
|
2011-04-11 13:27:11 -04:00
|
|
|
*/
|
|
|
|
getCurve: function() {
|
|
|
|
return this._curve;
|
|
|
|
},
|
|
|
|
|
2011-04-26 12:49:54 -04:00
|
|
|
/**
|
2011-07-08 16:25:42 -04:00
|
|
|
* The path this curve belongs to, if any.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-23 11:39:26 -04:00
|
|
|
* @type Item
|
|
|
|
* @bean
|
2011-04-26 12:49:54 -04:00
|
|
|
*/
|
2011-07-08 16:25:42 -04:00
|
|
|
getPath: function() {
|
|
|
|
return this._curve && this._curve._path;
|
2011-04-26 12:49:54 -04:00
|
|
|
},
|
|
|
|
|
2011-04-11 13:27:11 -04:00
|
|
|
/**
|
2011-05-27 14:06:57 -04:00
|
|
|
* The index of the curve within the {@link Path#curves} list, if the
|
2011-04-11 13:27:11 -04:00
|
|
|
* curve is part of a {@link Path} item.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-23 11:39:26 -04:00
|
|
|
* @type Index
|
|
|
|
* @bean
|
2011-04-11 13:27:11 -04:00
|
|
|
*/
|
|
|
|
getIndex: function() {
|
2011-04-26 12:49:54 -04:00
|
|
|
return this._curve && this._curve.getIndex();
|
2011-04-11 13:27:11 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The length of the path from its beginning up to the location described
|
|
|
|
* by this object.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-27 14:15:15 -04:00
|
|
|
* @type Number
|
2011-05-23 11:39:26 -04:00
|
|
|
* @bean
|
2011-04-11 13:27:11 -04:00
|
|
|
*/
|
2011-04-27 15:08:57 -04:00
|
|
|
getOffset: function() {
|
2011-04-27 15:48:41 -04:00
|
|
|
var path = this._curve && this._curve._path;
|
2011-04-27 15:08:57 -04:00
|
|
|
return path && path._getOffset(this);
|
2011-04-11 13:27:11 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The length of the curve from its beginning up to the location described
|
|
|
|
* by this object.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-27 14:15:15 -04:00
|
|
|
* @type Number
|
2011-05-23 11:39:26 -04:00
|
|
|
* @bean
|
2011-04-11 13:27:11 -04:00
|
|
|
*/
|
2011-04-27 15:08:57 -04:00
|
|
|
getCurveOffset: function() {
|
2011-07-06 16:18:40 -04:00
|
|
|
var parameter = this.getParameter();
|
|
|
|
return parameter != null && this._curve
|
|
|
|
&& this._curve.getLength(0, parameter);
|
2011-04-11 13:27:11 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The curve parameter, as used by various bezier curve calculations. It is
|
|
|
|
* value between {@code 0} (beginning of the curve) and {@code 1} (end of
|
|
|
|
* the curve).
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-27 14:15:15 -04:00
|
|
|
* @type Number
|
2011-05-23 11:39:26 -04:00
|
|
|
* @bean
|
2011-04-11 13:27:11 -04:00
|
|
|
*/
|
|
|
|
getParameter: function() {
|
2011-07-06 16:18:40 -04:00
|
|
|
if (this._parameter == null && this._curve && this._point)
|
2011-07-06 17:13:38 -04:00
|
|
|
this._parameter = this._curve.getParameterAt(this._point);
|
2011-04-26 12:49:54 -04:00
|
|
|
return this._parameter;
|
2011-04-11 13:27:11 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2011-05-23 11:39:26 -04:00
|
|
|
* The point which is defined by the {@link #curve} and
|
|
|
|
* {@link #parameter}.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-23 11:39:26 -04:00
|
|
|
* @type Point
|
|
|
|
* @bean
|
2011-04-11 13:27:11 -04:00
|
|
|
*/
|
|
|
|
getPoint: function() {
|
2011-07-06 16:14:44 -04:00
|
|
|
if (!this._point && this._curve && this._parameter != null)
|
|
|
|
this._point = this._curve.getPoint(this._parameter);
|
2011-04-11 13:27:11 -04:00
|
|
|
return this._point;
|
|
|
|
},
|
|
|
|
|
2011-04-27 14:26:03 -04:00
|
|
|
/**
|
2011-05-23 11:39:26 -04:00
|
|
|
* The tangential vector to the {@link #curve} at the given location.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-23 11:39:26 -04:00
|
|
|
* @type Point
|
|
|
|
* @bean
|
2011-04-27 14:26:03 -04:00
|
|
|
*/
|
|
|
|
getTangent: function() {
|
|
|
|
var parameter = this.getParameter();
|
|
|
|
return parameter != null && this._curve
|
|
|
|
&& this._curve.getTangent(parameter);
|
|
|
|
},
|
2011-06-30 06:01:51 -04:00
|
|
|
|
2011-04-27 14:26:03 -04:00
|
|
|
/**
|
2011-05-23 11:39:26 -04:00
|
|
|
* The normal vector to the {@link #curve} at the given location.
|
2011-06-30 06:01:51 -04:00
|
|
|
*
|
2011-05-23 11:39:26 -04:00
|
|
|
* @type Point
|
|
|
|
* @bean
|
2011-04-27 14:26:03 -04:00
|
|
|
*/
|
|
|
|
getNormal: function() {
|
|
|
|
var parameter = this.getParameter();
|
|
|
|
return parameter != null && this._curve
|
|
|
|
&& this._curve.getNormal(parameter);
|
|
|
|
},
|
|
|
|
|
2011-07-06 16:19:01 -04:00
|
|
|
/**
|
|
|
|
* The distance from the queried point to the returned location.
|
|
|
|
*
|
|
|
|
* @type Number
|
|
|
|
* @bean
|
|
|
|
*/
|
|
|
|
getDistance: function() {
|
|
|
|
return this._distance;
|
|
|
|
},
|
|
|
|
|
2011-05-23 11:39:26 -04:00
|
|
|
/**
|
2011-05-27 15:21:49 -04:00
|
|
|
* @return {String} A string representation of the curve location.
|
2011-05-23 11:39:26 -04:00
|
|
|
*/
|
2011-04-11 13:27:11 -04:00
|
|
|
toString: function() {
|
2011-05-04 14:42:50 -04:00
|
|
|
var parts = [],
|
|
|
|
point = this.getPoint();
|
2011-04-27 14:24:40 -04:00
|
|
|
if (point)
|
|
|
|
parts.push('point: ' + point);
|
2011-04-11 13:27:11 -04:00
|
|
|
var index = this.getIndex();
|
2011-05-01 08:18:36 -04:00
|
|
|
if (index != null)
|
2011-04-26 12:49:54 -04:00
|
|
|
parts.push('index: ' + index);
|
2011-04-11 13:27:11 -04:00
|
|
|
var parameter = this.getParameter();
|
2011-05-01 08:18:36 -04:00
|
|
|
if (parameter != null)
|
2011-05-04 14:42:50 -04:00
|
|
|
parts.push('parameter: ' + Base.formatNumber(parameter));
|
2011-07-07 16:14:58 -04:00
|
|
|
if (this._distance != null)
|
|
|
|
parts.push('distance: ' + Base.formatNumber(this._distance));
|
2011-05-02 06:23:42 -04:00
|
|
|
return '{ ' + parts.join(', ') + ' }';
|
2011-04-11 13:27:11 -04:00
|
|
|
}
|
2011-04-11 13:33:34 -04:00
|
|
|
});
|