From c40500d288339cd9b2200f8f909e3cd5471c0c22 Mon Sep 17 00:00:00 2001 From: riku <risaku@163.com> Date: 星期五, 30 八月 2024 17:38:29 +0800 Subject: [PATCH] 1. 优化3D动画中风向的变化逻辑; 2. 修复折线图切换因子时,数据直接跳转至起始处的问题; 3. 折线图和表格加回风向因子; 4. 优化风向的均值计算为矢量计算,同时最大最小值不显示; 5. 新增表格数据导出功能; --- src/components/monitor/DataSummary.vue | 91 ++++++++++++++++++++++++++++++++++----------- 1 files changed, 69 insertions(+), 22 deletions(-) diff --git a/src/components/monitor/DataSummary.vue b/src/components/monitor/DataSummary.vue index 4d4b9e2..250cdd7 100644 --- a/src/components/monitor/DataSummary.vue +++ b/src/components/monitor/DataSummary.vue @@ -26,7 +26,7 @@ header-cell-class-name="t-header-cell" > <el-table-column prop="factor" label="鍥犲瓙" width="66" /> - <el-table-column prop="avg" label="鍧囧��" width="66" /> + <el-table-column prop="avg" label="鍧囧��" width="84" /> <el-table-column prop="min" label="鏈�灏忓��" width="66" /> <el-table-column prop="max" label="鏈�澶у��" width="66" /> </el-table> @@ -38,6 +38,7 @@ <script> import { FactorDatas } from '@/model/FactorDatas'; import { factorName } from '@/constant/factor-name'; +import { windDir } from '@/constant/wind-dir'; export default { props: { @@ -56,27 +57,40 @@ for (const key in this.factorDatas.factor) { if (Object.hasOwnProperty.call(this.factorDatas.factor, key)) { const f = this.factorDatas.factor[key]; - let min, - max, - total = 0, - count = 0; - f.datas.forEach((v) => { - if (!min || v.factorData < min) { - min = v.factorData; - } - if (!max || v.factorData > max) { - max = v.factorData; - } - total += v.factorData; - count++; - }); - list.push({ - factorId: f.factorId, - factor: factorName[f.factorName], - min, - max, - avg: count == 0 ? 0 : Math.round((total / count) * 100) / 100 - }); + if (f.factorName == 'WIND_DIRECTION') { + const avg = this.windDirAvg(f); + list.push({ + factorId: f.factorId, + factor: factorName[f.factorName], + min: '-', + max: '-', + avg: `${avg}(${windDir(avg)})` + }); + } else { + let min, + max, + total = 0, + count = 0; + f.datas.forEach((v) => { + if (!min || v.factorData < min) { + min = v.factorData; + } + if (!max || v.factorData > max) { + max = v.factorData; + } + total += v.factorData; + count++; + }); + let _avg = count == 0 ? 0 : Math.round((total / count) * 100) / 100; + if (isNaN(_avg)) _avg = '-'; + list.push({ + factorId: f.factorId, + factor: factorName[f.factorName], + min, + max, + avg: _avg + }); + } } } return list; @@ -86,6 +100,39 @@ return this.selectFactorType.includes(v.factorId); }); } + }, + methods: { + windDirAvg(factor) { + let u = 0, // 涓滆タ鏂瑰悜鍒嗛噺鎬诲拰 + v = 0, // 鍗楀寳鏂瑰悜鍒嗛噺鎬诲拰 + c = 0; // 椋庡悜鏁版嵁涓暟 + factor.datas.forEach((value) => { + let r = (value.factorData / 180.0) * Math.PI; + u += Math.sin(r); + v += Math.cos(r); + c++; + }); + if (c != 0) { + const avgU = u / c; + const avgV = v / c; + let a = Math.atan(avgU / avgV); + /** + * avgU>0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗竴璞¢檺锛屼慨姝e�间负+0掳 + * avgU>0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗簩璞¢檺锛屼慨姝e�间负+180掳 + * avgU<0;avgV<0: 鐪熷疄瑙掑害澶勪簬绗笁璞¢檺锛屼慨姝e�间负+180掳 + * avgU<0;avgV>0: 鐪熷疄瑙掑害澶勪簬绗洓璞¢檺锛屼慨姝e�间负+360掳 + */ + a = (a * 180.0) / Math.PI; + if (avgV > 0) { + a += avgU > 0 ? 0 : 360; + } else { + a += 180; + } + return parseInt(a); + } else { + return 0; + } + } } }; </script> -- Gitblit v1.9.3