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