gaodd 2 years ago
parent
commit
1467a38c0a

+ 79 - 11
src/main/java/com/szls/nstths/service/impl/Algorithm.java

@@ -9,6 +9,11 @@ import java.util.List;
9 9
 public class Algorithm {
10 10
 
11 11
 
12
+	/**
13
+	 * 定义常量  减速机传动比
14
+	 */
15
+	public static int basicData = 50;
16
+	
12 17
     /**
13 18
      * 打点要发送的角度
14 19
      *
@@ -83,9 +88,9 @@ public class Algorithm {
83 88
 
84 89
                 }
85 90
 
86
-                sb.append(Math.round(vertical_angle) * 51);
91
+                sb.append(Math.round(vertical_angle) * basicData);
87 92
                 sb.append(",");
88
-                sb.append(Math.round(level_angle) * 51);
93
+                sb.append(Math.round(level_angle) * basicData);
89 94
                 sb.append(";");
90 95
 
91 96
                 // sb.append("\n");
@@ -98,9 +103,9 @@ public class Algorithm {
98 103
         AB = diameter / 2;//垂直三角形的底边
99 104
         BC = Math.sqrt(AB * AB + high * high);//垂直三角形的斜边
100 105
         vertical_angle = Math.toDegrees(Math.acos(high / BC));
101
-        sb.append(Math.round(vertical_angle) * 51);
106
+        sb.append(Math.round(vertical_angle) * basicData);
102 107
         sb.append(",");
103
-        sb.append(90*51);
108
+        sb.append(90 * basicData);
104 109
         //System.out.println(sb);
105 110
         return sb.toString();
106 111
 
@@ -127,17 +132,17 @@ public class Algorithm {
127 132
         double verticalAngle = 0;//垂直角度
128 133
         double levelAngle = 0;//水平角度
129 134
         double realHypotenuse = 0;//返回的距离
130
-        BigDecimal baseNumber = new BigDecimal(51);
135
+        BigDecimal baseNumber = new BigDecimal(basicData);
131 136
 
132 137
         //  "18,7,17.88 - 19,6,28.88 - 17,4,39.88"  垂直角度,水平角度,返回距离 -
133 138
         String[] split = rotationxy.split(";");
134 139
         for (int i = 0; i < split.length; i++) {
135
-        	//System.out.println("split[i]是:"+split[i]);
140
+            //System.out.println("split[i]是:"+split[i]);
136 141
             String[] split1 = split[i].split(",");
137
-            verticalAngle = new BigDecimal(split1[0]).divide(baseNumber,0,RoundingMode.HALF_UP).doubleValue();
138
-            levelAngle = new BigDecimal(split1[1]).divide(baseNumber,0,RoundingMode.HALF_UP).doubleValue();
139
-            realHypotenuse = new BigDecimal(split1[2]).divide(new BigDecimal(1000),2,RoundingMode.HALF_UP).doubleValue(); //单位转化为米
140
-            
142
+            verticalAngle = new BigDecimal(split1[0]).divide(baseNumber, 0, RoundingMode.HALF_UP).doubleValue();
143
+            levelAngle = new BigDecimal(split1[1]).divide(baseNumber, 0, RoundingMode.HALF_UP).doubleValue();
144
+            realHypotenuse = new BigDecimal(split1[2]).divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP).doubleValue(); //单位转化为米
145
+
141 146
             //将垂直的角度转化为弧度
142 147
             double verticalAngleRadians = Math.toRadians(verticalAngle);
143 148
             String verticalAngleS = String.format("%.2f%n", Math.sin(verticalAngleRadians));
@@ -167,7 +172,7 @@ public class Algorithm {
167 172
 
168 173
             }
169 174
         }
170
-         zHigh = Collections.min(zList);
175
+        zHigh = Collections.min(zList);
171 176
         return zHigh;
172 177
 		
173 178
 		
@@ -258,6 +263,69 @@ public class Algorithm {
258 263
     }
259 264
 
260 265
 
266
+    /**
267
+     * 有效的z的集合
268
+     */
269
+    public static List<Double> getValidZ(String rotationxy, double diameter, double high){
270
+    	List<Double> zList  = new ArrayList<Double>();
271
+    	
272
+        double AC = high;
273
+        //double B1C = 0;//设备和粮面点之间的距离
274
+        double A1B1 = 0;//粮面的点到设备的水平距离
275
+        double z = 0; //实际点的坐标的z轴
276
+        double verticalAngle = 0;//垂直角度
277
+        double levelAngle = 0;//水平角度
278
+        double realHypotenuse = 0;//返回的距离即设备和粮面间两点的距离
279
+        BigDecimal baseNumber = new BigDecimal(basicData);
280
+
281
+        //  "18,7,17.88 ; 19,6,28.88 ; 17,4,39.88"  垂直角度,水平角度,返回距离 ;
282
+        String[] split = rotationxy.split(";");
283
+        for (int i = 0; i < split.length; i++) {
284
+            //System.out.println("split[i]是:"+split[i]);
285
+            String[] split1 = split[i].split(",");
286
+            verticalAngle = new BigDecimal(split1[0]).divide(baseNumber, 0, RoundingMode.HALF_UP).doubleValue();
287
+            levelAngle = new BigDecimal(split1[1]).divide(baseNumber, 0, RoundingMode.HALF_UP).doubleValue();
288
+            realHypotenuse = new BigDecimal(split1[2]).divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP).doubleValue(); //单位转化为米
289
+
290
+            //将垂直的角度转化为弧度
291
+            double verticalAngleRadians = Math.toRadians(verticalAngle);
292
+            //垂直角度的sin
293
+            String verticalAngleS = String.format("%.2f%n", Math.sin(verticalAngleRadians));
294
+            double sinVerticalAngle = new Double(verticalAngleS);
295
+            //垂直角度的cos
296
+            String verticalAngleC = String.format("%.2f%n", Math.cos(verticalAngleRadians));
297
+            double cosVerticalAngle = new Double(verticalAngleC);
298
+            
299
+            //竖直三角形的底边 即 平面三角形的斜边  sinVerticalAngle有可能是负值 
300
+            A1B1 = realHypotenuse * sinVerticalAngle; 
301
+
302
+            //将水平的角度转化为弧度
303
+            double levelAngleRadians = Math.toRadians(levelAngle);
304
+            //水平角度的sin
305
+            String sinLevel = String.format("%.2f%n", Math.sin(levelAngleRadians));
306
+            double sinLeveld = new Double(sinLevel);
307
+            //水平角度的cos
308
+            /*String cosLevel = String.format("%.2f%n", Math.cos(levelAngleRadians));
309
+            double cosLeveld = new Double(cosLevel);*/
310
+
311
+            /*
312
+             * 对比实际的A1B1与打到墙上时最大的这个边进行比较 如果A1B1小于这个最大边则可取
313
+             * 如果A1B1大于或等于这个最大的边 则打到了墙上 舍去
314
+             * */
315
+            //打到墙上 最大的边
316
+            double maxLength = sinLeveld * diameter;
317
+
318
+            if (Math.abs(A1B1)< Math.abs(maxLength)) {
319
+                //实际打在粮面上的点的坐标(此时是以设备为坐标系的原点 分为上下两部分)
320
+                double A1C = realHypotenuse * cosVerticalAngle;
321
+                z = AC - A1C;
322
+                zList.add(z);
323
+            }
324
+        }
325
+        return zList;
326
+    
327
+    }
328
+    
261 329
     public static void main(String[] args) {
262 330
 
263 331
        /* BigDecimal bdv = BigDecimal.valueOf(12.125323);

+ 18 - 12
src/main/java/com/szls/nstths/service/impl/TeDataServiceImpl.java

@@ -1,7 +1,6 @@
1 1
 package com.szls.nstths.service.impl;
2 2
 
3 3
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
-import com.szls.nstths.controller.DataController;
5 4
 import com.szls.nstths.entity.ReMsg;
6 5
 import com.szls.nstths.entity.STask;
7 6
 import com.szls.nstths.entity.TeData;
@@ -9,6 +8,7 @@ import com.szls.nstths.mapper.ReMsgMapper;
9 8
 import com.szls.nstths.mapper.STaskMapper;
10 9
 import com.szls.nstths.mapper.TeDataMapper;
11 10
 import com.szls.nstths.service.TeDataService;
11
+
12 12
 import org.slf4j.Logger;
13 13
 import org.slf4j.LoggerFactory;
14 14
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,7 +16,6 @@ import org.springframework.scheduling.annotation.Async;
16 16
 import org.springframework.stereotype.Service;
17 17
 import org.springframework.web.client.RestTemplate;
18 18
 
19
-import java.beans.Transient;
20 19
 import java.util.ArrayList;
21 20
 import java.util.Date;
22 21
 import java.util.List;
@@ -113,7 +112,8 @@ public class TeDataServiceImpl implements TeDataService {
113 112
             String rotationxy = Algorithm.getAveragePosition(diameter, zHeight);
114 113
             teData.setRotationxy(rotationxy);
115 114
             teData.setStime(new Date());//第二次开始的时间
116
-            //postHelper(teData);
115
+            
116
+            postHelper(teData);
117 117
 
118 118
             flag = false;
119 119
         } else { //打点两次完毕 计算体积
@@ -154,23 +154,29 @@ public class TeDataServiceImpl implements TeDataService {
154 154
     @Override
155 155
     public void calculateVolume(String taskID) {
156 156
         // TODO Auto-generated method stub
157
+    	StringBuffer sb = new StringBuffer();
158
+    	
157 159
         List<Double> zList = new ArrayList<Double>();
158
-        String[] split = null;
159
-
160
+        double v = 0;
160 161
         QueryWrapper<TeData> queryWrapper = new QueryWrapper<>();
161 162
 
162 163
         List<TeData> teDataList = null;
163 164
         queryWrapper.eq("taskID", taskID);
164 165
         teDataList = teDataMapper.selectList(queryWrapper);
165
-        for (TeData teData : teDataList) {
166
-            split = teData.getRotationxy().split(";");
167
-            for (int i = 0; i < split.length; i++) {
168
-                String[] split1 = split[i].split(",");
169
-                //split1[2]  是返回的距离
170
-                //zList.add(Double.parseDouble(split1[2]) / 1000); //距离转化为米
166
+        
167
+        if(teDataList.size()>0){
168
+        	for (TeData teData : teDataList) {
169
+        		sb.append(teData.getRotationxy()+";");
171 170
             }
171
+        	String rotationxy = sb.substring(0, sb.length()-1).toString();//发送的角度和返回的距离  150,50,90;200,-100,90;50,-50,90
172
+    		
173
+    		//获取有效的z值
174
+        	 zList = Algorithm.getValidZ(rotationxy, diameter, high);
175
+            
176
+    		//计算体积
177
+            v = Algorithm.calculateVolume(zList, diameter, h1, h2); //体积
172 178
         }
173
-        //double v = Algorithm.calculateVolume(zList, diameter, h1, h2); //体积
179
+        logger.info("体积是: {}",v);
174 180
 
175 181
     }
176 182