UNPKG

@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
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