/** 相等, 相差小于diff */ export function equal(a: number, b: number, diff = 0.001): boolean { return Math.abs(a - b) < diff } /** ab相差dis */ export function isDiffer(a: number, b: number, dis: number, diff = 0.001): boolean { let rdis = Math.abs(a - b) return rdis > dis - diff && rdis < dis + diff } /** 两点间距离 */ export function getDis2(p1, p2): number { let x1 = p1.pointX || p1.X || p1.x || 0 let y1 = p1.pointY || p1.Y || p1.y || 0 let x2 = p2.pointX || p2.X || p2.x || 0 let y2 = p2.pointY || p2.Y || p2.y || 0 return getDis(x1, y1, x2, y2) } /** 两点间距离 */ export function getDis(x1: number, y1: number, x2: number, y2: number): number { let xt = x1 - x2 let yt = y1 - y2 return Math.sqrt(xt * xt + yt * yt) } /** 两点间弧度半径 */ export function getR(x1: number, y1: number, x2: number, y2: number, bul: number): number { if (bul == 0) return 0 let d = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) / 2 return 0.5 * d * (1 + bul ** 2) / bul } /** 获取两点间的半径 */ export function getR2(p1, p2): number { let bul = p1.Curve || p1.bul || 0 if (bul == 0) return 0 let x1 = p1.pointX || p1.X || p1.x let y1 = p1.pointY || p1.Y || p1.y let x2 = p2.pointX || p2.X || p2.x let y2 = p2.pointY || p2.Y || p2.y return getR(x1, y1, x2, y2, bul) } /** 截取小数点 */ export function round(n: number, bit = 3): number { if (bit < 1) return n let tt = 10 ** bit return Math.round(n * tt) / tt } /** * 获得四点p{x,y}形成的矩形{x,y,w,l}; * 不是矩形 返回null */ export function getRect(p0, p1, p2, p3): any { if (equal(p0.x, p1.x) == false && equal(p0.y, p1.y) == false) return null // 中心点 let xc = (p0.x + p1.x + p2.x + p3.x) / 4 let yc = (p0.y + p1.y + p2.y + p3.y) / 4 let dis0 = getDis(p0.x, p0.y, xc, yc) let dis1 = getDis(p1.x, p1.y, xc, yc) let dis2 = getDis(p2.x, p2.y, xc, yc) let dis3 = getDis(p3.x, p3.y, xc, yc) if (equal(dis0, dis1) && equal(dis0, dis2) && equal(dis0, dis3)) { let x = Math.min(p0.x, p1.x, p2.x, p3.x) let y = Math.min(p0.y, p1.y, p2.y, p3.y) let w = Math.max(p0.x, p1.x, p2.x, p3.x) - x let l = Math.max(p0.y, p1.y, p2.y, p3.y) - y if (w < 0.01 || l < 0.01) return null return { x, y, w, l } } return null } /** 获取两点的直线的一般式方程AX+BY+C=0 ABC */ export function getLineABC(x1: number, y1: number, x2: number, y2: number) { let A = y2 - y1 let B = x1 - x2 let C = x2 * y1 - x1 * y2 return { A, B, C } } /** 获取点 p(x,y) 到两点的线的距离 */ export function getDis_PointLine(x1: number, y1: number, x2: number, y2: number, x: number, y: number) { let abc = getLineABC(x1, y1, x2, y2) let aabb = Math.sqrt(abc.A * abc.A + abc.B * abc.B) if (aabb == 0) return 0 return Math.abs(abc.A * x + abc.B * y + abc.C) / aabb } /** 删除重复点 */ export function removeRepeatPoint(pts, fuzz = 0.01) { for (let n = pts.length - 1; n >= 0; n--) { let p = n - 1 if (p < 0) p = pts.length - 1 if (getDis2(pts[p], pts[n]) < fuzz) pts.splice(n, 1) } }