gaodd 3 years ago
parent
commit
782f71fa35

+ 5 - 5
src/main/java/com/szls/nstths/controller/DataController.java

@@ -39,13 +39,13 @@ public class DataController {
39 39
     /**
40 40
      *
41 41
      * @param height
42
-     * @param radius
42
+     * @param diameter 直径
43 43
      */
44 44
     @GetMapping("/scanning")
45
-    public void scanning(@RequestParam(value = "height", defaultValue = "12") String height,
46
-                         @RequestParam(value = "radius", defaultValue = "12") String radius) {
45
+    public void scanning(@RequestParam(value = "height", defaultValue = "35") double height,
46
+                         @RequestParam(value = "diameter ", defaultValue = "12") double diameter) {
47 47
 
48
-        logger.info("{},{}",height,radius);
49
-        teDataService.scanTask();
48
+        logger.info("{},{}",height,diameter);
49
+        teDataService.scanTask(diameter,height);
50 50
     }
51 51
 }

+ 10 - 1
src/main/java/com/szls/nstths/service/TeDataService.java

@@ -23,8 +23,10 @@ public interface TeDataService {
23 23
 
24 24
     /**
25 25
      * 第一次待打点
26
+     * @param height 
27
+     * @param diameter 
26 28
      */
27
-    public void scanTask();
29
+    public void scanTask(double diameter, double high);
28 30
 
29 31
     /**
30 32
      * 第二次待打点
@@ -32,5 +34,12 @@ public interface TeDataService {
32 34
      * @return 数据库影响条数
33 35
      */
34 36
     public int scanTask(TeData teData);
37
+    
38
+
39
+    /**
40
+     * 计算体积
41
+     * @param taskID
42
+     */
43
+	public void calculateVolume(String taskID);
35 44
 
36 45
 }

+ 264 - 0
src/main/java/com/szls/nstths/service/impl/Algorithm.java

@@ -0,0 +1,264 @@
1
+package com.szls.nstths.service.impl;
2
+
3
+import java.math.BigDecimal;
4
+import java.util.ArrayList;
5
+import java.util.Collections;
6
+import java.util.List;
7
+
8
+import org.junit.jupiter.api.Test;
9
+
10
+public class Algorithm {
11
+
12
+	
13
+	/**
14
+	 * 打点要发送的角度
15
+	 * @param diameter
16
+	 * @param high
17
+	 * @return
18
+	 */
19
+	public static String getAveragePosition(double diameter, double high) {
20
+        StringBuffer sb = new StringBuffer();
21
+
22
+        double x1 = 0;
23
+        double y1 = 0;
24
+        //打出来三角形的底边AB 实际是平面上点的斜边
25
+        double AB = 0; //理想状态
26
+        double x = 0;
27
+        double y = 0;
28
+        double BC = 0;
29
+        double vertical_angle = 0;//垂直的角度
30
+        double level_angle = 0;//水平的角度
31
+        /*double vertical_step = 0;//垂直的步长
32
+        double level_step = 0;//水平的步长
33
+*/
34
+        //根据直径判断半径是整数还是非整数 如果是非整数 则向下取整
35
+        double r = Math.floor(diameter / 2);  //最大的半径 即一共有多少个圆圈
36
+
37
+        //一共有多少个圆圈
38
+        int circleNumber = (int) r;
39
+
40
+        for (int i = 1; i <= circleNumber; i++) {
41
+            //每一个圆一共有多少个的点   此时的半径长就是i
42
+            int pointCount = (int) ((2 * Math.PI * i) / 1.57);
43
+
44
+            for (int j = 0; j < pointCount; j++) {
45
+
46
+                /**
47
+                 * 以其他点为圆心的圆  r是i degrees是以圆心为中心转动的角度 其坐标x1、y1则是
48
+                 */
49
+                double degrees = (360 / pointCount) * j;
50
+                //System.out.println(degrees+"度数");
51
+                double radians = Math.toRadians(degrees);//转化为弧度
52
+                String strx = String.format("%.2f%n", Math.cos(radians) * i);//计算横坐标的值
53
+                x1 = new Double(strx);
54
+                String stry = String.format("%.2f%n", Math.sin(radians) * i);//计算纵坐标的值
55
+                y1 = new Double(stry);
56
+
57
+                /**
58
+                 * 以设备为中心,把圆上的点分为上下两半,
59
+                 * 新的圆 是旧的圆向左平移了(diameter/2-i)+i 个长度 得到的
60
+                 * (设备在新的圆的最左边上,设备是坐标系的原点)
61
+                 * 所以 横坐标加上这个长度  纵坐标不变
62
+                 */
63
+
64
+                //纵坐标 无论是处于上半部分还是下半部分 其纵坐标是不变的
65
+                x = x1 + (diameter / 2 - i) + i;
66
+                y = y1;
67
+                //System.out.print("["+x+","+y+"]"+",");
68
+                //底面三角形的斜边
69
+                AB = Math.sqrt(x * x + y * y);
70
+                //垂直三角形的斜边
71
+                BC = Math.sqrt(AB * AB + high * high);
72
+                if (x == 0 && y == 0) {//圆 点
73
+                    level_angle = 0;
74
+                    vertical_angle = 0;
75
+
76
+                } else if (y < 0) {//反向转
77
+                    level_angle = -Math.toDegrees(Math.acos(Math.abs(y) / AB));
78
+                    vertical_angle = -(Math.toDegrees(Math.acos(high / BC)));
79
+
80
+                } else {//正向转
81
+                    level_angle = Math.toDegrees(Math.acos(y / AB));
82
+                    vertical_angle = Math.toDegrees(Math.acos(high / BC));
83
+
84
+                }
85
+
86
+                sb.append(Math.round(level_angle));
87
+                sb.append(",");
88
+                sb.append(Math.round(vertical_angle));
89
+                sb.append("-");
90
+                // sb.append("\n");
91
+            }
92
+        }
93
+
94
+        /**
95
+         * 追加一个圆筒仓中心的点,其坐标是(diameter/2,0) 水平转动90度 步长为2167
96
+         */
97
+        AB = diameter / 2;//垂直三角形的底边
98
+        BC = Math.sqrt(AB * AB + high * high);//垂直三角形的斜边
99
+        vertical_angle = Math.toDegrees(Math.acos(high / BC));
100
+        sb.append(90);
101
+        sb.append(",");
102
+        sb.append(Math.round(vertical_angle));
103
+        // sb.append("\n");
104
+        //System.out.println(Math.round(level_step)+","+Math.round(vertical_step)+"");
105
+        //System.out.println(sb);
106
+        System.out.println(sb);
107
+        return sb.toString();
108
+    
109
+	}
110
+	
111
+	
112
+	/**
113
+	 * 计算  以粮面为基准面的高
114
+	 * @param list
115
+	 * @return
116
+	 */
117
+	public static double zHeight(String rotationxy,double diameter, double high) {
118
+        
119
+		List<Double> zList = new ArrayList<Double>();
120
+		
121
+        // logger.info("zHeight - list",list);
122
+		double AC = high;
123
+        double B1C = 0;//设备和粮面点之间的距离
124
+        double A1B1 = 0;//粮面到设备的水平距离
125
+        double z = 0; //实际点的坐标的z轴
126
+        double zHigh = 0;//以粮面为基准面的高
127
+        double zMax = 0;//最高的点
128
+        double verticalAngle = 0;//垂直角度
129
+        double levelAngle = 0;//水平角度
130
+        double realHypotenuse = 0;//返回的距离
131
+        
132
+		
133
+		//  "18,7,17.88 - 19,6,28.88 - 17,4,39.88"  水平角度,垂直角度,返回距离 - 
134
+		String[] split = rotationxy.split("-");
135
+		for (int i = 0; i < split.length; i++) {
136
+			String[] split1 = split[i].split(",");
137
+			levelAngle = Double.parseDouble(split1[0]);
138
+			verticalAngle = Double.parseDouble(split1[1]);
139
+			realHypotenuse = Double.parseDouble(split1[2]);
140
+			
141
+			//将垂直的角度转化为弧度
142
+            double verticalAngleRadians = Math.toRadians(verticalAngle);
143
+            String verticalAngleS = String.format("%.2f%n", Math.sin(verticalAngleRadians));
144
+            double sinc = new Double(verticalAngleS);
145
+            //B1C = realHypotenuse;
146
+            A1B1 = realHypotenuse * sinc; //即 平面三角形的斜边
147
+
148
+            //logger.info("zHeight - A1B1 {} ",A1B1);
149
+
150
+            String sinLevel = String.format("%.2f%n", Math.sin(Math.abs(levelAngle)));
151
+            double sinLevelc = new Double(sinLevel);
152
+            
153
+            /*
154
+             * 对比实际的A1B1与打到墙上时最大的这个边进行比较 如果A1B1小于这个最大边则可取
155
+             * 如果A1B1大于或等于这个最大的边 则打到了墙上 舍去
156
+             * */
157
+           //打到墙上 最大的边
158
+            double maxLength = sinLevelc * diameter;
159
+            
160
+            if (A1B1 < maxLength) {
161
+                //实际打在粮面上的点的坐标
162
+                String verticalAngleC = String.format("%.2f%n", Math.cos(verticalAngleRadians));
163
+                double cosc = new Double(verticalAngleC);
164
+                double A1C = realHypotenuse * cosc;
165
+                z = AC - A1C;
166
+
167
+
168
+                // logger.info("zHeight - z√√√√√√z z z z z {} ",z);
169
+
170
+                zList.add(z);
171
+            }
172
+		}
173
+		
174
+		zMax = Collections.max(zList);
175
+        zHigh = AC - zMax;
176
+        return zHigh;
177
+		
178
+		
179
+		
180
+	/*	
181
+
182
+        
183
+        for (ReceiveData angleObject : list) {
184
+            verticalAngle = angleObject.getVerticalAngle();
185
+            levelAngle = angleObject.getLevelAngle();
186
+            realHypotenuse = angleObject.getRealHypotenuse();
187
+            //logger.info("zHeight - realHypotenuse {} ",realHypotenuse);
188
+
189
+            //将垂直的角度转化为弧度
190
+            double verticalAngleRadians = Math.toRadians(verticalAngle);
191
+            String verticalAngleS = String.format("%.2f%n", Math.sin(verticalAngleRadians));
192
+            double sinc = new Double(verticalAngleS);
193
+            //B1C = realHypotenuse;
194
+            A1B1 = realHypotenuse * sinc; //即 平面三角形的斜边
195
+
196
+            //logger.info("zHeight - A1B1 {} ",A1B1);
197
+
198
+            String sinLevel = String.format("%.2f%n", Math.sin(Math.abs(levelAngle)));
199
+            double sinLevelc = new Double(sinLevel);
200
+
201
+            *//**
202
+             * 对比实际的A1B1与打到墙上时最大的这个边进行比较 如果A1B1小于这个最大边则可取
203
+             * 如果A1B1大于或等于这个最大的边 则打到了墙上 舍去
204
+             *//*
205
+            //打到墙上 最大的边
206
+            double maxLength = sinLevelc * diameter;
207
+
208
+            if (A1B1 < maxLength) {
209
+                //实际打在粮面上的点的坐标
210
+                String verticalAngleC = String.format("%.2f%n", Math.cos(verticalAngleRadians));
211
+                double cosc = new Double(verticalAngleC);
212
+                double A1C = realHypotenuse * cosc;
213
+                z = AC - A1C;
214
+
215
+
216
+                // logger.info("zHeight - z√√√√√√z z z z z {} ",z);
217
+
218
+                zList.add(z);
219
+            }
220
+        }
221
+        zMax = Collections.max(zList);
222
+        zHigh = AC - zMax;
223
+        return zHigh;
224
+*/
225
+    }
226
+	
227
+	
228
+	
229
+	/**
230
+     * 计算体积
231
+     *
232
+     * @param zList 粮面高集合(z值的集合)
233
+     */
234
+    public static double calculateVolume(List<Double> zList,double diameter,double h1,double h2) {
235
+
236
+        //17.1  18.3  19.2  18.3    20.1  16.4  19.8  16.7  19.0  18.9
237
+        Double zMin = Collections.min(zList); //z的最小值
238
+
239
+        double sum = 0;
240
+        double zHeigh = 0;//每一个z与最低点的z差值
241
+        for (int i = 0; i < zList.size(); i++) {
242
+            //sum = zList.get(i)+sum;
243
+            zHeigh = zList.get(i) - zMin;
244
+            sum += zHeigh;
245
+
246
+        }
247
+        /** v 是总体积
248
+         * v1 最上面的那一部分
249
+         * v2 是中间的圆柱
250
+         * v3 是 圆锥
251
+         *
252
+         * h1 圆锥的高
253
+         * h2 水平地面到圆锥尖的高
254
+         */
255
+
256
+        double v1 = 3.14 * (diameter / 2) * (diameter / 2) * (sum / zList.size());
257
+        double v2 = 3.14 * (diameter / 2) * (diameter / 2) * (zMin - h2 - h1);
258
+        double v3 = (3.14 * (diameter / 2) * (diameter / 2) * h1) / 3;
259
+        double vv = v1 + v2 + v3;
260
+        BigDecimal bdv = new BigDecimal(vv);
261
+        double v = bdv.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
262
+        return v;
263
+    }
264
+}

+ 53 - 15
src/main/java/com/szls/nstths/service/impl/TeDataServiceImpl.java

@@ -1,5 +1,6 @@
1 1
 package com.szls.nstths.service.impl;
2 2
 
3
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
3 4
 import com.szls.nstths.entity.ReMsg;
4 5
 import com.szls.nstths.entity.STask;
5 6
 import com.szls.nstths.entity.TeData;
@@ -9,12 +10,18 @@ import com.szls.nstths.service.TeDataService;
9 10
 import org.springframework.beans.factory.annotation.Autowired;
10 11
 import org.springframework.web.client.RestTemplate;
11 12
 
13
+import java.util.ArrayList;
12 14
 import java.util.Date;
15
+import java.util.List;
13 16
 
14 17
 public class TeDataServiceImpl implements TeDataService {
15 18
 
16 19
     static String base_url = "http://local.wxlxit.com:61001/";
17 20
     static boolean flag = true;
21
+    static double diameter = 0; //直径
22
+    static double high = 0; //圆筒仓的高(以地面为基准面)
23
+    static double h1 = 6; //h1 圆锥的高
24
+    static double h2 = 3; //h2 水平地面到圆锥尖的高
18 25
     private STaskMapper sTaskMapper;
19 26
     private TeDataMapper teDataMapper;
20 27
 
@@ -37,8 +44,9 @@ public class TeDataServiceImpl implements TeDataService {
37 44
      */
38 45
 
39 46
     @Override
40
-    public void scanTask() {
47
+    public void scanTask(double diameter, double high) {
41 48
 
49
+    	
42 50
         STask task = new STask();
43 51
         Date date = new Date();
44 52
         task.setCtime(date);
@@ -51,7 +59,8 @@ public class TeDataServiceImpl implements TeDataService {
51 59
         teData.setStime(date);
52 60
 
53 61
         //todo 第一次待打点
54
-        teData.setRotationxy("");
62
+        String rotationxy = Algorithm.getAveragePosition(diameter, high);
63
+        teData.setRotationxy(rotationxy);
55 64
         teDataMapper.insert(teData);
56 65
 
57 66
         postHelper(teData);
@@ -61,21 +70,26 @@ public class TeDataServiceImpl implements TeDataService {
61 70
 
62 71
     @Override
63 72
     public int scanTask(TeData teData) {
64
-
65
-        teData.getEquipmentID();
66
-        teData.getTaskID();
67
-
68
-        //todo 第二次待打点
69
-        teData.setRotationxy("");
70
-        int inum = teDataMapper.insert(teData);
71
-
72
-        //只运行 发送一次。
73
+    	//只运行 发送一次。
73 74
         if (flag) {
74
-            postHelper(teData);
75
-            flag = false;
75
+	        teData.getEquipmentID();
76
+	        teData.getTaskID();
77
+	
78
+	        //todo 第二次待打点
79
+	        
80
+	        //计算以粮面为基准面的高
81
+	        double zHeight = Algorithm.zHeight(teData.getRotationxy(),diameter, high);
82
+	        //打点
83
+	        String rotationxy = Algorithm.getAveragePosition(diameter, zHeight);
84
+	        teData.setRotationxy(rotationxy);
85
+	        int inum = teDataMapper.insert(teData);
86
+	
87
+	        postHelper(teData);
88
+	        flag = false;
89
+	
90
+	        return inum;
76 91
         }
77
-
78
-        return inum;
92
+        return 0;
79 93
     }
80 94
 
81 95
     public ReMsg postHelper(TeData teData) {
@@ -90,6 +104,30 @@ public class TeDataServiceImpl implements TeDataService {
90 104
         return null;
91 105
     }
92 106
 
107
+    
108
+    @Override
109
+	public void calculateVolume(String taskID) {
110
+		// TODO Auto-generated method stub
111
+		List<Double> zList = new ArrayList<Double>();
112
+		String[] split = null;
113
+		
114
+		QueryWrapper<TeData> queryWrapper = new QueryWrapper<>();
115
+
116
+        List<TeData> teDataList = null;
117
+        queryWrapper.eq("taskID", taskID);
118
+        teDataList = teDataMapper.selectList(queryWrapper);
119
+		for (TeData teData : teDataList) {
120
+			split = teData.getRotationxy().split("-");
121
+			for (int i = 0; i < split.length; i++) {
122
+				String[] split1 = split[i].split(",");
123
+				//split1[2]  是返回的距离
124
+				zList.add(Double.parseDouble(split1[2]));
125
+			}
126
+		}
127
+		double v = Algorithm.calculateVolume(zList,diameter,h1,h2); //体积
128
+		
129
+	}
130
+    
93 131
     public static void main(String[] args) {
94 132
         String str = "18,7,17.88-19,6,28.88-17,4,39.88";
95 133