import { equaln } from "../Geometry/GeUtils"; import { clamp as CLAMP, FixedNotZero } from "./Utils"; let abs = Math.abs; let acos = Math.acos; let acosh = Math.acosh; let asin = Math.asin; let asinh = Math.asinh; let atan = Math.atan; let atanh = Math.atanh; let atan2 = Math.atan2; let ceil = Math.ceil; let cbrt = Math.cbrt; let expm1 = Math.expm1; let clz32 = Math.clz32; let cos = Math.cos; let cosh = Math.cosh; let exp = Math.exp; let floor = Math.floor; let fround = Math.fround; let hypot = Math.hypot; let imul = Math.imul; let log = Math.log; let log1p = Math.log1p; let log2 = Math.log2; let log10 = Math.log10; let max = Math.max; let min = Math.min; let pow = Math.pow; let random = Math.random; let round = Math.round; let sign = Math.sign; let sin = Math.sin; let sinh = Math.sinh; let sqrt = Math.sqrt; let tan = Math.tan; let tanh = Math.tanh; let trunc = Math.trunc; let E = Math.E; let LN10 = Math.LN10; let LN2 = Math.LN2; let LOG10E = Math.LOG10E; let LOG2E = Math.LOG2E; let PI = Math.PI; let SQRT1_2 = Math.SQRT1_2; let SQRT2 = Math.SQRT2; let clamp = CLAMP; let eq = equaln; let OPERATORS = new Set(["+", "-", "*", "/"]); /** * eval2("+10", { L: 100 }, "L") * @param expr * @param [params] * @param [defaultParam] 当输入 +10 这样的表达式时,设置默认的操作变量 * @returns 计算结果 */ export function eval2(expr: string, params?: {}, defaultParam?: string): number { let code = ""; if (params) for (let name in params) code += `let ${name} = ${params[name]};`; if (defaultParam) { expr = expr.trimLeft(); if (expr[0] && OPERATORS.has(expr[0])) expr = defaultParam + expr; } code += expr; let result = eval(code); if (typeof result === "function") return result(); return Number(result);//防止bigint乱入 } export function safeEval(expr: string, params?: {}, defaultParam?: string): number { try { return eval2(expr, params, defaultParam); } catch (error) { return NaN; } } export function CheckExpr(expr: string, params: any) { let resultObj = { res: undefined, error: undefined }; try { resultObj.res = eval2(expr, params); } catch (error) { resultObj.error = error; } return resultObj; } const Reg_Expr = /\{[^\}]+\}/g; /**解析大括号内的 */ export function ParseExpr(expr: string, params?: {}) { let strs = expr.match(Reg_Expr); if (!strs) return expr; for (let str of strs) expr = expr.replace(str, FixedNotZero(safeEval(str.slice(1, -1), params), 2)); return expr; }