feat:提交
This commit is contained in:
128
tests/dev1/dataHandle/common/base/MathComm.ts
Normal file
128
tests/dev1/dataHandle/common/base/MathComm.ts
Normal file
@@ -0,0 +1,128 @@
|
||||
/** 相等, 相差小于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)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user