123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- "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;
|