"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SMathUtil = void 0; const lib_1 = require("@persagy-web/draw/lib"); const polybooljs_1 = require("polybooljs"); class SMathUtil { static pointDistance(x1, y1, x2, y2) { return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); } static getMinDisPoint(p, arr) { if (!arr.length) { return null; } let minDis = { MinDis: SMathUtil.pointDistance(p.x, p.y, arr[0].X, -arr[0].Y), Point: arr[0] }; for (let i = 1; i < arr.length; i++) { let ds = SMathUtil.pointDistance(p.x, p.y, arr[i].X, -arr[i].Y); if (ds < minDis.MinDis) { minDis.MinDis = ds; minDis.Point = arr[i]; } } return minDis; } static pointToLine(p, l) { let d = { MinDis: Number.MAX_SAFE_INTEGER, Line: new lib_1.SLine(), Point: new lib_1.SPoint() }; let bgX = Math.max(l.x1, l.x2); let smX = Math.min(l.x1, l.x2); if (l.dx == 0) { let bgY = Math.max(l.y1, l.y2); let smY = Math.min(l.y1, l.y2); if (p.y > smY && p.y < bgY) { d.MinDis = Math.abs(p.x - l.x1); d.Line = l; d.Point = new lib_1.SPoint(l.x1, p.y); } } else if (l.dy == 0) { if (p.x > smX && p.x < bgX) { d.MinDis = Math.abs(p.y - l.y1); d.Line = l; d.Point = new lib_1.SPoint(p.x, l.y1); } } else { let k1 = (l.y1 - l.y2) / (l.x1 - l.x2); let b1 = l.y1 - k1 * l.x1; let k2 = -1 / k1; let b2 = p.y - k2 * p.x; let x = (b1 - b2) / (k2 - k1); let y = k1 * x + b1; if (x > smX && x < bgX) { d.MinDis = SMathUtil.pointDistance(p.x, p.y, x, y); d.Line = l; d.Point = new lib_1.SPoint(x, y); } } return d; } static getMinDisLine(p, arr) { if (arr.length < 2) { return null; } let PTL = SMathUtil.pointToLine(p, new lib_1.SLine(arr[arr.length - 1].X, -arr[arr.length - 1].Y, arr[0].X, -arr[0].Y)); for (let i = 0; i < arr.length - 1; i++) { let temp = SMathUtil.pointToLine(p, new lib_1.SLine(arr[i].X, -arr[i].Y, arr[i + 1].X, -arr[i + 1].Y)); if (temp.MinDis < PTL.MinDis) { PTL = temp; } } return PTL; } static rectIntersection(rect1, rect2) { let minX = rect1.x < rect2.x ? rect1.x : rect2.x; let minY = rect1.y < rect2.y ? rect1.y : rect2.y; let maxX = rect1.right > rect2.right ? rect1.right : rect2.right; let maxY = rect1.bottom > rect2.bottom ? rect2.bottom : rect2.bottom; return (rect1.width + rect2.width > maxX - minX && rect1.height + rect2.height > maxY - minY); } static lineIntersection(line1, line2) { let k1 = line1.dy / line1.dx; let b1 = line1.y1 - k1 * line1.x1; let k2 = line2.dy / line2.dx; let b2 = line2.y1 - k2 * line2.x1; if (k1 == k2) { if (b1 == b2) { return "repeat"; } return null; } let intersectionX = (b2 - b1) / (k1 - k2); let intersectionY = k1 * intersectionX + b1; let minX = Math.min(line1.x1, line1.x2); let maxX = Math.min(line2.x1, line2.x2); if (intersectionX >= minX && intersectionX <= maxX) { return new lib_1.SPoint(intersectionX, intersectionY); } return null; } static transferToArray(SP) { return SP.map((t) => { return [t.x, t.y]; }); } static transferToSPoint(arr) { return arr.map((t) => { return new lib_1.SPoint(t[0], t[1]); }); } static getIntersectInArray(array) { let outlineList = []; if (!array.length) { } else if (array.length == 1) { let outline = { Outer: [], Inner: [] }; outline.Outer = array[0].map((t) => { return new lib_1.SPoint(t[0], t[1]); }); outlineList.push(outline); } else { let poly2 = { regions: [], inverted: false }; poly2.regions.push(array[array.length - 1]); let indexArr = [array.length - 1]; for (let i = array.length - 2; i > 0; i--) { let poly1 = { regions: [], inverted: false }; poly1.regions.push(array[i]); let intersectObj = polybooljs_1.intersect(poly1, poly2); console.log(intersectObj); if (!intersectObj.regions.length) { indexArr.unshift(i); poly2.regions = []; poly2.regions.push(array[i]); } } indexArr.unshift(0); console.log(indexArr); for (let i = 0; i < indexArr.length - 1; i++) { let axArr = array.slice(i == 0 ? 0 : indexArr[i] + 1, indexArr[i + 1]); let outline = { Outer: [], Inner: [] }; outline.Outer = array[indexArr[i + 1]].map((t) => { return new lib_1.SPoint(t[0], t[1]); }); outline.Inner = axArr.map((t) => { return t.map((item) => { return new lib_1.SPoint(item[0], item[1]); }); }); outlineList.push(outline); } } console.log(outlineList); return outlineList; } static calculateArea(arr) { let sum = 0; let n = arr.length; arr[n] = arr[0]; for (let i = 1; i <= n; i++) { sum += arr[i].x * arr[i - 1].y - arr[i - 1].x * arr[i].y; } return sum / 2; } } exports.SMathUtil = SMathUtil;