@aurigma/design-atoms-model
Version:
Design Atoms is a part of Customer's Canvas SDK which allows for manipulating individual design elements through your code.
117 lines • 4.24 kB
JavaScript
import { RectangleF } from "./RectangleF";
import { PointF } from "./PointF";
// Oriented Square.
export var getOrientedSquare = function (p1, p2, p3) {
return (p1.x * p2.y + p1.y * p3.x + p2.x * p3.y) - (p3.x * p2.y + p2.x * p1.y + p3.y * p1.x);
};
// Get bounding rectangle of array of points
export var getBounds = function (points) {
if (points.length == 0) {
return new RectangleF(0, 0, 0, 0);
}
var p = points[0], minX = p.x, maxX = p.x, minY = p.y, maxY = p.y;
for (var i = 1, imax = points.length; i < imax; ++i) {
p = points[i];
minX = Math.min(minX, p.x);
maxX = Math.max(maxX, p.x);
minY = Math.min(minY, p.y);
maxY = Math.max(maxY, p.y);
}
return new RectangleF(minX, minY, maxX - minX, maxY - minY);
};
// returns angle in degree near p3 point.
export var getTriangleAngle = function (p1, p2, p3) {
var c2 = Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2);
var b2 = Math.pow(p1.x - p3.x, 2) + Math.pow(p1.y - p3.y, 2);
var a2 = Math.pow(p2.x - p3.x, 2) + Math.pow(p2.y - p3.y, 2);
var cosAlpha = 0;
if (a2 * b2 !== 0) {
cosAlpha = Clamp(-1, (-c2 + a2 + b2) / (2 * Math.sqrt(a2) * Math.sqrt(b2)), 1);
}
//FEDOR: What is it?
// oriented s.
var orientedSquare = getOrientedSquare(p1, p2, p3);
var angle = Math.acos(cosAlpha);
if (orientedSquare > 0)
angle = -angle;
return ConvertRadianToDegree(angle);
};
export var normalizeAngle = function (angle) {
angle = angle % 360;
if (angle < 0) {
angle += 360;
}
return angle;
};
//return scalar product of 2 vectors
export var getScalarProduct = function (v1, v2) {
return (v1.x * v2.x + v1.y * v2.y);
};
//return square the distance from piont to segment,
//p - point, p1 - start of segment, p2 - end of segment
export var getSquareDistanceToSegment = function (p, p1, p2) {
var v = new PointF(p2.x - p1.x, p2.y - p1.y);
var w = new PointF(p.x - p1.x, p.y - p1.y);
var c1 = getScalarProduct(w, v);
if (c1 <= 0)
return getSquareDistanceToPoint(p, p1);
var c2 = getScalarProduct(v, v);
if (c2 < c1)
return getSquareDistanceToPoint(p, p2);
var b = c1 / c2;
var ph = new PointF(p1.x + v.x * b, p1.y + v.y * b);
return getSquareDistanceToPoint(p, ph);
};
//return square the distance between 2 points
export var getSquareDistanceToPoint = function (p1, p2) {
return (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y);
};
// returns width of the line depending on scale factors.
export var getLineWidth = function (p1, p2, width, scaleX, scaleY) {
function solve(x, y, x1, y1) {
var a = Math.pow(y - y1, 2);
var b = Math.pow(x - x1, 2);
return Math.sqrt(a * b / (b + a));
}
if (p1.x == p2.x)
return width * scaleX;
if (p1.y == p2.y)
return width * scaleY;
var a = solve(p1.x, p1.y, p2.x, p2.y);
var b = solve(p1.x * scaleX, p1.y * scaleY, p2.x * scaleX, p2.y * scaleY);
return width * b / a;
};
export var ConvertDegreeToRadian = function (angle) {
return Math.PI * angle / 180;
};
export var ConvertRadianToDegree = function (angle) {
return 180 * angle / Math.PI;
};
export var Clamp = function (min, val, max) {
return Math.max(min, Math.min(max, val));
};
export var EqualsOfFloatNumbers = function (f1, f2, tolerance) {
if (typeof f1 != "number" || typeof f2 != "number")
return false;
if (typeof tolerance != "number")
tolerance = 0.0001;
return tolerance != 0 ? Math.abs(f1 - f2) <= tolerance : f1 == f2;
};
export var CompareRectangels = function (rects0, rects1) {
if (rects0.length !== rects1.length)
return false;
for (var i = 0; i < rects0.length; i++) {
var rect = rects0[i];
var contains = false;
for (var j = 0; j < rects1.length; j++) {
if (rect.isEqual(rects1[j])) {
contains = true;
break;
}
}
if (!contains)
return false;
}
return true;
};
//# sourceMappingURL=Common.js.map