|
@@ -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);
|