88 lines
2.6 KiB
JavaScript
88 lines
2.6 KiB
JavaScript
/**
|
|
* @class Ext.util.LineSegment
|
|
*
|
|
* Utility class that represents a line segment, constructed by two {@link Ext.util.Point}
|
|
*/
|
|
Ext.define('Ext.util.LineSegment', {
|
|
requires: ['Ext.util.Point'],
|
|
|
|
/**
|
|
* Creates new LineSegment out of two points.
|
|
* @param {Ext.util.Point} point1
|
|
* @param {Ext.util.Point} point2
|
|
*/
|
|
constructor: function(point1, point2) {
|
|
var Point = Ext.util.Point;
|
|
|
|
this.point1 = Point.from(point1);
|
|
this.point2 = Point.from(point2);
|
|
},
|
|
|
|
/**
|
|
* Returns the point where two lines intersect.
|
|
* @param {Ext.util.LineSegment} lineSegment The line to intersect with.
|
|
* @return {Ext.util.Point}
|
|
*/
|
|
intersects: function(lineSegment) {
|
|
var point1 = this.point1,
|
|
point2 = this.point2,
|
|
point3 = lineSegment.point1,
|
|
point4 = lineSegment.point2,
|
|
x1 = point1.x,
|
|
x2 = point2.x,
|
|
x3 = point3.x,
|
|
x4 = point4.x,
|
|
y1 = point1.y,
|
|
y2 = point2.y,
|
|
y3 = point3.y,
|
|
y4 = point4.y,
|
|
d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4),
|
|
xi, yi;
|
|
|
|
if (d == 0) {
|
|
return null;
|
|
}
|
|
|
|
xi = ((x3 - x4) * (x1 * y2 - y1 * x2) - (x1 - x2) * (x3 * y4 - y3 * x4)) / d;
|
|
yi = ((y3 - y4) * (x1 * y2 - y1 * x2) - (y1 - y2) * (x3 * y4 - y3 * x4)) / d;
|
|
|
|
if (xi < Math.min(x1, x2) || xi > Math.max(x1, x2)
|
|
|| xi < Math.min(x3, x4) || xi > Math.max(x3, x4)
|
|
|| yi < Math.min(y1, y2) || yi > Math.max(y1, y2)
|
|
|| yi < Math.min(y3, y4) || yi > Math.max(y3, y4)) {
|
|
return null;
|
|
}
|
|
|
|
return new Ext.util.Point(xi, yi);
|
|
},
|
|
|
|
getLength: function() {
|
|
return Math.abs(this.point1.getDistanceTo(this.point2));
|
|
},
|
|
|
|
getAngleToX: function() {
|
|
var point1 = this.point1,
|
|
point2 = this.point2,
|
|
deltaY = point2.y - point1.y,
|
|
deltaX = point2.x - point1.x;
|
|
|
|
return Math.atan2(deltaY, deltaX);
|
|
},
|
|
|
|
getInBetweenPoint: function(distance) {
|
|
var point1 = this.point1,
|
|
angle = this.getAngleToX(),
|
|
x = point1.x + Math.cos(angle) * distance,
|
|
y = point1.y + Math.sin(angle) * distance;
|
|
|
|
return new Ext.util.Point(x, y);
|
|
},
|
|
|
|
/**
|
|
* Returns string representation of the line. Useful for debugging.
|
|
* @return {String} For example `Point[12,8] Point[0,0]`
|
|
*/
|
|
toString: function() {
|
|
return this.point1.toString() + " " + this.point2.toString();
|
|
}
|
|
}); |