mirror of
https://github.com/scratchfoundation/paper.js.git
synced 2025-01-01 02:38:43 -05:00
Add documentation from Point.java to Point.js, remove TODO about adding back center support to Scriptographer for Point#rotate, since it is already there.
This commit is contained in:
parent
d37a794b64
commit
a3ec524722
1 changed files with 220 additions and 11 deletions
|
@ -70,6 +70,22 @@ var Point = Base.extend({
|
||||||
return matrix.transform(this);
|
return matrix.transform(this);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the distance between the point and another point.
|
||||||
|
*
|
||||||
|
* Sample code:
|
||||||
|
* <code>
|
||||||
|
* var firstPoint = new Point(5, 10);
|
||||||
|
* var secondPoint = new Point(5, 20);
|
||||||
|
*
|
||||||
|
* var distance = firstPoint.getDistance(secondPoint);
|
||||||
|
*
|
||||||
|
* print(distance); // 10
|
||||||
|
* </code>
|
||||||
|
*
|
||||||
|
* @param px
|
||||||
|
* @param py
|
||||||
|
*/
|
||||||
getDistance: function() {
|
getDistance: function() {
|
||||||
var point = Point.read(arguments);
|
var point = Point.read(arguments);
|
||||||
var px = point.x - this.x;
|
var px = point.x - this.x;
|
||||||
|
@ -84,6 +100,12 @@ var Point = Base.extend({
|
||||||
return px * px + py * py;
|
return px * px + py * py;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The length of the vector that is represented by this point's coordinates.
|
||||||
|
* Each point can be interpreted as a vector that points from the origin
|
||||||
|
* ({@code x = 0},{@code y = 0}) to the point's location.
|
||||||
|
* Setting the length changes the location but keeps the vector's angle.
|
||||||
|
*/
|
||||||
getLength: function() {
|
getLength: function() {
|
||||||
var point = Point.read(arguments);
|
var point = Point.read(arguments);
|
||||||
return Math.sqrt(this.x * this.x + this.y * this.y);
|
return Math.sqrt(this.x * this.x + this.y * this.y);
|
||||||
|
@ -135,7 +157,6 @@ var Point = Base.extend({
|
||||||
return Math.atan2(this.y, this.x) * 180 / Math.PI;
|
return Math.atan2(this.y, this.x) * 180 / Math.PI;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
getQuadrant: function() {
|
getQuadrant: function() {
|
||||||
if (this.x >= 0) {
|
if (this.x >= 0) {
|
||||||
if (this.y >= 0) {
|
if (this.y >= 0) {
|
||||||
|
@ -152,15 +173,20 @@ var Point = Base.extend({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setAngle: function(angle) {
|
/**
|
||||||
angle = this._angle = angle * Math.PI / 180;
|
* {@grouptitle Angle & Rotation}
|
||||||
if (!this.isZero()) {
|
*
|
||||||
var length = this.length;
|
* The vector's angle, measured from the x-axis to the vector.
|
||||||
this.x = Math.cos(angle) * length;
|
*
|
||||||
this.y = Math.sin(angle) * length;
|
* When supplied with a point, returns the smaller angle between two
|
||||||
}
|
* vectors. The angle is unsigned, no information about rotational
|
||||||
},
|
* direction is given.
|
||||||
|
*
|
||||||
|
* Read more about angle units and orientation in the description of the
|
||||||
|
* {@link #getAngle()} property.
|
||||||
|
*
|
||||||
|
* @param point
|
||||||
|
*/
|
||||||
getAngle: function() {
|
getAngle: function() {
|
||||||
var angle;
|
var angle;
|
||||||
if (arguments.length) {
|
if (arguments.length) {
|
||||||
|
@ -179,6 +205,24 @@ var Point = Base.extend({
|
||||||
return angle * 180 / Math.PI;
|
return angle * 180 / Math.PI;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setAngle: function(angle) {
|
||||||
|
angle = this._angle = angle * Math.PI / 180;
|
||||||
|
if (!this.isZero()) {
|
||||||
|
var length = this.length;
|
||||||
|
this.x = Math.cos(angle) * length;
|
||||||
|
this.y = Math.sin(angle) * length;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the angle between two vectors. The angle is directional and
|
||||||
|
* signed, giving information about the rotational direction.
|
||||||
|
*
|
||||||
|
* Read more about angle units and orientation in the description of the
|
||||||
|
* {@link #getAngle()} property.
|
||||||
|
*
|
||||||
|
* @param point
|
||||||
|
*/
|
||||||
getDirectedAngle: function() {
|
getDirectedAngle: function() {
|
||||||
var point = Point.read(arguments);
|
var point = Point.read(arguments);
|
||||||
var angle = this.angle - point.angle;
|
var angle = this.angle - point.angle;
|
||||||
|
@ -192,7 +236,17 @@ var Point = Base.extend({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// TODO: Add center parameter support back to Scriptographer
|
/**
|
||||||
|
* Rotates the point by the given angle around an optional center point.
|
||||||
|
* The object itself is not modified.
|
||||||
|
*
|
||||||
|
* Read more about angle units and orientation in the description of the
|
||||||
|
* {@link #getAngle()} property.
|
||||||
|
*
|
||||||
|
* @param angle the rotation angle
|
||||||
|
* @param center the center point of the rotation
|
||||||
|
* @return the rotated point
|
||||||
|
*/
|
||||||
rotate: function(angle, center) {
|
rotate: function(angle, center) {
|
||||||
var point = center ? this.subtract(center) : this;
|
var point = center ? this.subtract(center) : this;
|
||||||
angle = angle * Math.PI / 180;
|
angle = angle * Math.PI / 180;
|
||||||
|
@ -205,6 +259,16 @@ var Point = Base.extend({
|
||||||
return center ? point.add(center) : point;
|
return center ? point.add(center) : point;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the interpolation point between the point and another point.
|
||||||
|
* The object itself is not modified!
|
||||||
|
*
|
||||||
|
* @param point
|
||||||
|
* @param t the position between the two points as a value between 0 and 1
|
||||||
|
* @return the interpolation point
|
||||||
|
*
|
||||||
|
* @jshide
|
||||||
|
*/
|
||||||
interpolate: function(point, t) {
|
interpolate: function(point, t) {
|
||||||
return Point.create(
|
return Point.create(
|
||||||
this.x * (1 - t) + point.x * t,
|
this.x * (1 - t) + point.x * t,
|
||||||
|
@ -212,52 +276,152 @@ var Point = Base.extend({
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@grouptitle Tests}
|
||||||
|
*
|
||||||
|
* Checks whether the point is inside the boundaries of the rectangle.
|
||||||
|
*
|
||||||
|
* @param rect the rectangle to check against
|
||||||
|
* @return {@true if the point is inside the rectangle}
|
||||||
|
*/
|
||||||
isInside: function(rect) {
|
isInside: function(rect) {
|
||||||
return rect.contains(this);
|
return rect.contains(this);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the point is within a given distance of another point.
|
||||||
|
*
|
||||||
|
* @param point the point to check against
|
||||||
|
* @param tolerance the maximum distance allowed
|
||||||
|
* @return {@true if it is within the given distance}
|
||||||
|
*/
|
||||||
isClose: function(point, tolerance) {
|
isClose: function(point, tolerance) {
|
||||||
return this.getDistance(point) < tolerance;
|
return this.getDistance(point) < tolerance;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the vector represented by this point is parallel (collinear) to
|
||||||
|
* another vector.
|
||||||
|
*
|
||||||
|
* @param point the vector to check against
|
||||||
|
* @return {@true if it is parallel}
|
||||||
|
*/
|
||||||
isParallel: function(point) {
|
isParallel: function(point) {
|
||||||
return Math.abs(this.x / point.x - this.y / point.y) < 0.00001;
|
return Math.abs(this.x / point.x - this.y / point.y) < 0.00001;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if this point has both the x and y coordinate set to 0.
|
||||||
|
*
|
||||||
|
* @return {@true if both x and y are 0}
|
||||||
|
*/
|
||||||
isZero: function() {
|
isZero: function() {
|
||||||
return this.x == 0 && this.y == 0;
|
return this.x == 0 && this.y == 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if this point has an undefined value for at least one of its
|
||||||
|
* coordinates.
|
||||||
|
*
|
||||||
|
* @return {@true if either x or y are not a number}
|
||||||
|
*/
|
||||||
isNaN: function() {
|
isNaN: function() {
|
||||||
return isNaN(this.x) || isNaN(this.y);
|
return isNaN(this.x) || isNaN(this.y);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@grouptitle Math Functions}
|
||||||
|
*
|
||||||
|
* Returns a new point with rounded {@link #x} and {@link #y} values. The
|
||||||
|
* object itself is not modified!
|
||||||
|
*
|
||||||
|
* Sample code:
|
||||||
|
* <code>
|
||||||
|
* var point = new Point(10.2, 10.9);
|
||||||
|
* var roundPoint = point.round();
|
||||||
|
* print(roundPoint); // { x: 10.0, y: 11.0 }
|
||||||
|
* </code>
|
||||||
|
*/
|
||||||
round: function() {
|
round: function() {
|
||||||
return Point.create(Math.round(this.x), Math.round(this.y));
|
return Point.create(Math.round(this.x), Math.round(this.y));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new point with the nearest greater non-fractional values to the
|
||||||
|
* specified {@link #x} and {@link #y} values. The object itself is not
|
||||||
|
* modified!
|
||||||
|
*
|
||||||
|
* Sample code:
|
||||||
|
* <code>
|
||||||
|
* var point = new Point(10.2, 10.9);
|
||||||
|
* var ceilPoint = point.ceil();
|
||||||
|
* print(ceilPoint); // { x: 11.0, y: 11.0 }
|
||||||
|
* </code>
|
||||||
|
*/
|
||||||
ceil: function() {
|
ceil: function() {
|
||||||
return Point.create(Math.ceil(this.x), Math.ceil(this.y));
|
return Point.create(Math.ceil(this.x), Math.ceil(this.y));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new point with the nearest smaller non-fractional values to the
|
||||||
|
* specified {@link #x} and {@link #y} values. The object itself is not
|
||||||
|
* modified!
|
||||||
|
*
|
||||||
|
* Sample code:
|
||||||
|
* <code>
|
||||||
|
* var point = new Point(10.2, 10.9);
|
||||||
|
* var floorPoint = point.floor();
|
||||||
|
* print(floorPoint); // { x: 10.0, y: 10.0 }
|
||||||
|
* </code>
|
||||||
|
*/
|
||||||
floor: function() {
|
floor: function() {
|
||||||
return Point.create(Math.floor(this.x), Math.floor(this.y));
|
return Point.create(Math.floor(this.x), Math.floor(this.y));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new point with the absolute values of the specified {@link #x}
|
||||||
|
* and {@link #y} values. The object itself is not modified!
|
||||||
|
*
|
||||||
|
* Sample code:
|
||||||
|
* <code>
|
||||||
|
* var point = new Point(-5, 10);
|
||||||
|
* var absPoint = point.abs();
|
||||||
|
* print(absPoint); // { x: 5.0, y: 10.0 }
|
||||||
|
* </code>
|
||||||
|
*/
|
||||||
abs: function() {
|
abs: function() {
|
||||||
return Point.create(Math.abs(this.x), Math.abs(this.y));
|
return Point.create(Math.abs(this.x), Math.abs(this.y));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@grouptitle Vectorial Math Functions}
|
||||||
|
*
|
||||||
|
* Returns the dot product of the point and another point.
|
||||||
|
* @param point
|
||||||
|
* @return the dot product of the two points
|
||||||
|
*/
|
||||||
dot: function() {
|
dot: function() {
|
||||||
var point = Point.read(arguments);
|
var point = Point.read(arguments);
|
||||||
return this.x * point.x + this.y * point.y;
|
return this.x * point.x + this.y * point.y;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the cross product of the point and another point.
|
||||||
|
* @param point
|
||||||
|
* @return the cross product of the two points
|
||||||
|
*/
|
||||||
cross: function() {
|
cross: function() {
|
||||||
var point = Point.read(arguments);
|
var point = Point.read(arguments);
|
||||||
return this.x * point.y - this.y - point.x;
|
return this.x * point.y - this.y - point.x;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the projection of the point on another point.
|
||||||
|
* Both points are interpreted as vectors.
|
||||||
|
*
|
||||||
|
* @param point
|
||||||
|
* @return the project of the point on another point
|
||||||
|
*/
|
||||||
project: function() {
|
project: function() {
|
||||||
var point = Point.read(arguments);
|
var point = Point.read(arguments);
|
||||||
if (point.isZero()) {
|
if (point.isZero()) {
|
||||||
|
@ -301,18 +465,63 @@ var Point = Base.extend({
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new point object with the smallest {@link #x} and
|
||||||
|
* {@link #y} of the supplied points.
|
||||||
|
*
|
||||||
|
* Sample code:
|
||||||
|
* <code>
|
||||||
|
* var point1 = new Point(10, 100);
|
||||||
|
* var point2 = new Point(200, 5);
|
||||||
|
* var minPoint = Point.min(point1, point2);
|
||||||
|
* print(minPoint); // { x: 10.0, y: 5.0 }
|
||||||
|
* </code>
|
||||||
|
*
|
||||||
|
* @param point1
|
||||||
|
* @param point2
|
||||||
|
* @return The newly created point object
|
||||||
|
*/
|
||||||
min: function(point1, point2) {
|
min: function(point1, point2) {
|
||||||
return Point.create(
|
return Point.create(
|
||||||
Math.min(point1.x, point2.x),
|
Math.min(point1.x, point2.x),
|
||||||
Math.min(point1.y, point2.y));
|
Math.min(point1.y, point2.y));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a new point object with the largest {@link #x} and
|
||||||
|
* {@link #y} of the supplied points.
|
||||||
|
*
|
||||||
|
* Sample code:
|
||||||
|
* <code>
|
||||||
|
* var point1 = new Point(10, 100);
|
||||||
|
* var point2 = new Point(200, 5);
|
||||||
|
* var maxPoint = Point.max(point1, point2);
|
||||||
|
* print(maxPoint); // { x: 200.0, y: 100.0 }
|
||||||
|
* </code>
|
||||||
|
*
|
||||||
|
* @param point1
|
||||||
|
* @param point2
|
||||||
|
* @return The newly created point object
|
||||||
|
*/
|
||||||
max: function(point1, point2) {
|
max: function(point1, point2) {
|
||||||
return Point.create(
|
return Point.create(
|
||||||
Math.max(point1.x, point2.x),
|
Math.max(point1.x, point2.x),
|
||||||
Math.max(point1.y, point2.y));
|
Math.max(point1.y, point2.y));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a point object with random {@link #x} and {@link #y} values
|
||||||
|
* between {@code 0} and {@code 1}.
|
||||||
|
*
|
||||||
|
* Sample code:
|
||||||
|
* <code>
|
||||||
|
* var maxPoint = new Point(100, 100);
|
||||||
|
* var randomPoint = Point.random();
|
||||||
|
*
|
||||||
|
* // A point between {x:0, y:0} and {x:100, y:100}:
|
||||||
|
* var point = maxPoint * randomPoint;
|
||||||
|
* </code>
|
||||||
|
*/
|
||||||
random: function() {
|
random: function() {
|
||||||
return Point.create(Math.random(), Math.random());
|
return Point.create(Math.random(), Math.random());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue