define(function () { /** *数学工具类 *@memberof Cesium *@constructor */ function MathUtil() { } /** * * 判断给定对象是否为数组 *@param {Object|*}obj */ MathUtil.isArray = function (obj) { return Object.prototype.toString.call(obj) === '[object Array]'; } /** * 计算最大值 * @function MathUtil.getMinMax * @param {Array.} arr 数组 * @param {Number}invalidValue 无效值 * @returns {Number} */ MathUtil.getMinMax = function (arr, invalidValue) { // if (!MathUtil.isArray(arr)) { // throw new Error("参数不是数组"); // } var hasInvalidValueParams = typeof invalidValue !== 'undefined' && invalidValue != null; var min = Number.MAX_VALUE, max = -Number.MAX_VALUE; for (var i = 0; i < arr.length; i++) { if (!MathUtil.isArray(arr[i]) && !arr[i].length && (isNaN(arr[i]) || (hasInvalidValueParams && invalidValue == arr[i]))) { continue; } if (arr[i] instanceof Array || MathUtil.isArray(arr[i]) || arr[i].length) { var minMax = MathUtil.getMinMax(arr[i], invalidValue); min = Math.min(minMax[0], min); max = Math.max(minMax[1], max); } else { var v=parseFloat( arr[i])+0.0000001; min = Math.min(arr[i], min); if (v-max>0) { max = v; } // max = Math.max(v, max); } } return [min, max]; } /** *地球半径 *@Object MathUtil.EARTH_RADIUS */ MathUtil.EARTH_RADIUS = 6378.137; //地球半径 /** *角度转弧度 *@param {Number} d */ MathUtil.rad = function (d) { return d * Math.PI / 180.0; } /** * 计算距离 * @param {Array.} arr 数组 * @returns {Number} */ MathUtil.getDistance = function (lat1, lng1, lat2, lng2) { var radLat1 = MathUtil.rad(lat1); var radLat2 = MathUtil.rad(lat2); var a = radLat1 - radLat2; var b = MathUtil.rad(lng1) - MathUtil.rad(lng2); var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s = s * MathUtil.EARTH_RADIUS; s = Math.round(s * 10000) / 10000; return s; } /** * 计算距离 * @param {Array.} arr 数组 * @returns {Number} */ MathUtil.computeLength = function (Points_lc) { var len = 0; for (var i = 1; i < Points_lc.length; i++) { var p1 = Points_lc[i - 1], p2 = Points_lc[i]; len += MathUtil.getDistance(p1.lat, p1.lon, p2.lat, p2.lon); } return len; } /** * 计算距离 * @param {Array.} arr 数组 * @returns {Number} */ MathUtil.computeLength2 = function (Points_lc) { var len = 0; for (var i = 1; i < Points_lc.length; i++) { var p1 = Points_lc[i - 1], p2 = Points_lc[i]; len += Cesium.Cartesian3.distance(p1, p2); } return len; } /** * 计算平均值 * @param {Array.} arr 数组 * @returns {Number} */ MathUtil.avrage = function (arr) { /// 计算平均值 /// 数组 var ret = 0; for (var i = 0; i < arr.length; i++) { ret += arr[i]; } ret = ret / arr.length; return ret; } /** * 计算标准差 * @param {Array.} arr 数组 * @returns {Number} */ MathUtil.standardDeviation = function (arr) { /// 计算标准差 /// 数组 var u = MathUtil.avrage(arr); var ret = 0; for (var i = 0; i < arr.length; i++) { ret += (arr[i] - u) * (arr[i] - u); } ret = ret / arr.length; ret = Math.sqrt(ret); return ret; } /** *风场u、v分量转为风速大小(spr)和方向(dir) *@param {Number}u *@param {Number}v *@param {Array}outWin */ MathUtil.uv2wind = function uv2wind(u, v, outWin) { var spd = Math.sqrt(u * u + v * v) var tmp = 0.0 - Math.atan2(v, u) * 180.0 / Map.PI var dir = tmp % 360.0; outWin[0] = spd; outWin[1] = dir; } /** *风速大小(spr)和方向(dir)转为风场u、v分量 *@param {Number}spd *@param {Number}dir *@param {Array}outUV */ MathUtil.wind2uv = function wind2uv(spd, dir, outUV) { var tmp = (0.0 - dir) * Math.PI / 180.0; outUV[0] = spd * Math.cos(tmp); outUV[1] = spd * Math.sin(tmp); } return MathUtil; })