|
|
@@ -12,15 +12,25 @@ import java.util.List;
|
|
12
|
12
|
*/
|
|
13
|
13
|
public class SquareAlg {
|
|
14
|
14
|
|
|
|
15
|
+ /**
|
|
|
16
|
+ * 定义常量 减速机传动比
|
|
|
17
|
+ */
|
|
|
18
|
+ public static int basicData = 50;
|
|
15
|
19
|
|
|
16
|
|
- public static String getAveragePosition(double houseWideOn, double houseWideUnder, double houseLengthLeft, double houseLengthRight,double houseHigh) {
|
|
|
20
|
+ //0.5米做安全隔墙
|
|
|
21
|
+ public static double boundaryValue = 0.5;
|
|
|
22
|
+
|
|
|
23
|
+ //每隔2米打一个点
|
|
|
24
|
+ public static double spacingDistance = 2;
|
|
|
25
|
+
|
|
|
26
|
+ public static String getAveragePosition(double houseWideOn, double houseWideUnder, double houseLengthLeft, double houseLengthRight,double houseHigh) {
|
|
17
|
27
|
|
|
18
|
28
|
StringBuffer sb = new StringBuffer();
|
|
19
|
29
|
String str = "";
|
|
20
|
30
|
//AC 是设备到地面/粮面最高点的高
|
|
21
|
31
|
double AC = houseHigh;
|
|
22
|
32
|
/**
|
|
23
|
|
- * 设备安装的点为o 设备到左面的点为a上面的点为b 右面的点为c 下面的点为d
|
|
|
33
|
+ * 设备安装的点为o 设备到左面的点为a 上面的点为b 右面的点为c 下面的点为d
|
|
24
|
34
|
* oa ob oc od 根据设备可以获取得到
|
|
25
|
35
|
* 以o为起点每间隔两米打一个点
|
|
26
|
36
|
* b
|
|
|
@@ -31,8 +41,8 @@ public class SquareAlg {
|
|
31
|
41
|
* | 3 | 4 |
|
|
32
|
42
|
* |---------------|
|
|
33
|
43
|
* d
|
|
34
|
|
- * 水平方向的 以bd为开始 向左即(2和4 区域的)是反方向的;(23区域)是正方向的
|
|
35
|
|
- * 垂直方向的 以ac为开始 向上即(1和2区域的)是正方向;(3和4区域)是反方向的
|
|
|
44
|
+ * 水平转动的方向 以bd为开始 向左即(1和4 区域的)是反方向的;(23区域)是正方向的
|
|
|
45
|
+ * 垂直转动的方向 以ac为开始 向上即(1和2区域的)是正方向;(3和4区域)是反方向的
|
|
36
|
46
|
*
|
|
37
|
47
|
*/
|
|
38
|
48
|
double oa = houseLengthLeft;
|
|
|
@@ -41,36 +51,37 @@ public class SquareAlg {
|
|
41
|
51
|
double od = houseWideUnder;
|
|
42
|
52
|
/**
|
|
43
|
53
|
* 第一块
|
|
44
|
|
- * 以o为起点 oa、ob方向每隔两米打一个点
|
|
|
54
|
+ * 以o为起点 oa、ob方向每隔spacingDistance米打一个点
|
|
45
|
55
|
* +1是把起点o算上
|
|
46
|
56
|
* 打出来的点 包括区域里的和x轴和y轴
|
|
47
|
57
|
*/
|
|
48
|
|
- double x = 0;
|
|
49
|
|
- double y = 0;
|
|
50
|
|
- double AB = 0; //理想状态 打出来三角形的底边AB 实际是平面上点的斜边
|
|
|
58
|
+ double x = 0;//点的横坐标
|
|
|
59
|
+ double y = 0;//点的纵坐标
|
|
|
60
|
+ double AB = 0; //理想状态 垂直三角形的底边AB 实际是平面三角形的斜边
|
|
51
|
61
|
double level_angle = 0;//水平转动的角度
|
|
52
|
|
- double BC = 0; //设备和粮面点之间的距离
|
|
53
|
62
|
double vertical_angle = 0;//垂直转动角度
|
|
|
63
|
+ double BC = 0; //设备和粮面点之间的距离
|
|
54
|
64
|
|
|
55
|
65
|
int level_angle1 = 0;//水平转动的角度
|
|
56
|
66
|
int vertical_angle1 = 0;//垂直转动角度
|
|
57
|
|
- for (int i = 0; i < Math.floor(ob/2)+1 ; i++) {
|
|
58
|
|
- for(int j = 0; j < Math.floor(oa/2)+1 ; j++){
|
|
59
|
|
- x = -2*j;
|
|
60
|
|
- y = 2*i;
|
|
|
67
|
+ for (int i = 0; i < Math.floor(ob/spacingDistance)+1 ; i++) {//i和j表示点的个数
|
|
|
68
|
+ for(int j = 0; j < Math.floor(oa/spacingDistance)+1 ; j++){
|
|
|
69
|
+ x = -spacingDistance * j;
|
|
|
70
|
+ y = spacingDistance * i;
|
|
61
|
71
|
//System.out.println("("+x+","+y+")");
|
|
62
|
72
|
AB = Math.sqrt(x*x+y*y);
|
|
63
|
|
- if(x == 0 && y>=0){
|
|
|
73
|
+ if(x == 0 && y >= 0){
|
|
64
|
74
|
level_angle = 0;
|
|
65
|
|
- }else if(y == 0 && x<0){
|
|
|
75
|
+ }else if(y == 0 && x != 0){
|
|
66
|
76
|
level_angle = -90;
|
|
67
|
77
|
}else{
|
|
68
|
78
|
level_angle = -Math.toDegrees(Math.atan((Math.abs(x))/y));
|
|
69
|
79
|
}
|
|
70
|
80
|
BC = Math.sqrt(AB*AB+AC*AC);
|
|
71
|
81
|
vertical_angle = Math.toDegrees(Math.acos(AC/BC));
|
|
72
|
|
- level_angle1 = (int) Math.round(level_angle);
|
|
73
|
|
- vertical_angle1 = (int) Math.round(vertical_angle);
|
|
|
82
|
+
|
|
|
83
|
+ level_angle1 = (int) (Math.round(level_angle) * basicData);
|
|
|
84
|
+ vertical_angle1 = (int) (Math.round(vertical_angle) * basicData);
|
|
74
|
85
|
|
|
75
|
86
|
str = vertical_angle1 + ","+level_angle1+";";
|
|
76
|
87
|
sb.append(str);
|
|
|
@@ -85,10 +96,10 @@ public class SquareAlg {
|
|
85
|
96
|
*
|
|
86
|
97
|
* 打出来的点 只有 x轴和区域的点
|
|
87
|
98
|
*/
|
|
88
|
|
- for(int i = 0; i < Math.floor(ob/2)+1 ; i++){
|
|
89
|
|
- for(int j = 1; j <= Math.floor(oc/2) ; j++){
|
|
90
|
|
- x = 2*j;
|
|
91
|
|
- y = 2*i;
|
|
|
99
|
+ for(int i = 0; i < Math.floor(ob/spacingDistance)+1 ; i++){
|
|
|
100
|
+ for(int j = 1; j <= Math.floor(oc/spacingDistance) ; j++){
|
|
|
101
|
+ x = spacingDistance * j;
|
|
|
102
|
+ y = spacingDistance * i;
|
|
92
|
103
|
//System.out.println("("+x+","+y+")");
|
|
93
|
104
|
AB = Math.sqrt(x*x+y*y);
|
|
94
|
105
|
if(y == 0){
|
|
|
@@ -98,8 +109,9 @@ public class SquareAlg {
|
|
98
|
109
|
}
|
|
99
|
110
|
BC = Math.sqrt(AB*AB+AC*AC);
|
|
100
|
111
|
vertical_angle = Math.toDegrees(Math.acos(AC/BC));
|
|
101
|
|
- level_angle1 = (int) Math.round(level_angle);
|
|
102
|
|
- vertical_angle1 = (int) Math.round(vertical_angle);
|
|
|
112
|
+
|
|
|
113
|
+ level_angle1 = (int) Math.round(level_angle) * basicData;
|
|
|
114
|
+ vertical_angle1 = (int) Math.round(vertical_angle) *basicData;
|
|
103
|
115
|
str = vertical_angle1 + ","+level_angle1+";";
|
|
104
|
116
|
sb.append(str);
|
|
105
|
117
|
}
|
|
|
@@ -113,10 +125,10 @@ public class SquareAlg {
|
|
113
|
125
|
* 打出来的点 包括区域里的和y轴
|
|
114
|
126
|
*/
|
|
115
|
127
|
|
|
116
|
|
- for (int i = 1; i <= Math.floor(oa/2)+1 ; i++) {
|
|
117
|
|
- for(int j = 0; j < Math.floor(od/2) ; j++){
|
|
118
|
|
- x = -2*j;
|
|
119
|
|
- y = -2*i;
|
|
|
128
|
+ for (int i = 1; i < Math.floor(od/spacingDistance)+1 ; i++) {
|
|
|
129
|
+ for(int j = 0; j < Math.floor(oa/spacingDistance)+1 ; j++){
|
|
|
130
|
+ x = -spacingDistance * j;
|
|
|
131
|
+ y = -spacingDistance * i;
|
|
120
|
132
|
//System.out.println("("+x+","+y+")");
|
|
121
|
133
|
AB = Math.sqrt(x*x+y*y);
|
|
122
|
134
|
if(x == 0){
|
|
|
@@ -126,8 +138,8 @@ public class SquareAlg {
|
|
126
|
138
|
}
|
|
127
|
139
|
BC = Math.sqrt(AB*AB+AC*AC);
|
|
128
|
140
|
vertical_angle = -Math.toDegrees(Math.acos(AC/BC));
|
|
129
|
|
- level_angle1 = (int) Math.round(level_angle);
|
|
130
|
|
- vertical_angle1 = (int) Math.round(vertical_angle);
|
|
|
141
|
+ level_angle1 = (int) Math.round(level_angle) * basicData;
|
|
|
142
|
+ vertical_angle1 = (int) Math.round(vertical_angle) * basicData;
|
|
131
|
143
|
str = vertical_angle1 + ","+level_angle1+";";
|
|
132
|
144
|
sb.append(str);
|
|
133
|
145
|
}
|
|
|
@@ -139,40 +151,40 @@ public class SquareAlg {
|
|
139
|
151
|
* 以o为起点 oc、od方向每隔两米打一个点
|
|
140
|
152
|
* 打出来的点 只有区域的点
|
|
141
|
153
|
*/
|
|
142
|
|
- for(int i = 1; i <= Math.floor(oc/2) ; i++){
|
|
143
|
|
- for(int j = 1; j <= Math.floor(od/2) ; j++){
|
|
144
|
|
- x = 2*i;
|
|
145
|
|
- y = -2*j;
|
|
|
154
|
+ for(int i = 1; i <= Math.floor(oc/spacingDistance) ; i++){
|
|
|
155
|
+ for(int j = 1; j <= Math.floor(od/spacingDistance) ; j++){
|
|
|
156
|
+ x = spacingDistance * i;
|
|
|
157
|
+ y = -spacingDistance * j;
|
|
146
|
158
|
// System.out.println("("+x+","+y+")");
|
|
147
|
159
|
AB = Math.sqrt(x*x+y*y);
|
|
148
|
160
|
level_angle = -Math.toDegrees(Math.atan(x/(Math.abs(y))));
|
|
149
|
161
|
BC = Math.sqrt(AB*AB+AC*AC);
|
|
150
|
162
|
vertical_angle = -Math.toDegrees(Math.acos(AC/BC));
|
|
151
|
|
- level_angle1 = (int) Math.round(level_angle);
|
|
152
|
|
- vertical_angle1 = (int) Math.round(vertical_angle);
|
|
|
163
|
+ level_angle1 = (int) Math.round(level_angle) * basicData;
|
|
|
164
|
+ vertical_angle1 = (int) Math.round(vertical_angle) * basicData;
|
|
153
|
165
|
str = vertical_angle1 + ","+level_angle1+";";
|
|
154
|
166
|
sb.append(str);
|
|
155
|
167
|
}
|
|
156
|
168
|
|
|
157
|
169
|
}
|
|
158
|
|
- //System.out.println(sb);
|
|
159
|
|
- return sb.toString();
|
|
|
170
|
+ String returnString = sb.substring(0, sb.length()-1);
|
|
|
171
|
+ //System.out.println(returnString);
|
|
|
172
|
+
|
|
|
173
|
+ return returnString;
|
|
160
|
174
|
|
|
161
|
175
|
}
|
|
162
|
176
|
|
|
163
|
177
|
|
|
164
|
178
|
/**
|
|
165
|
|
- * 计算 粮面点到设备的垂直距离(有效点)
|
|
|
179
|
+ * 计算 z的有效点
|
|
166
|
180
|
*
|
|
167
|
181
|
* @param rotationxy
|
|
168
|
182
|
* @return
|
|
169
|
183
|
*/
|
|
170
|
|
- public static List<Double> zHeight(String rotationxy,double houseWideOn,double houseWideUnder,double houseLengthLeft,double houseLengthRight) {
|
|
|
184
|
+ public static List<Double> zHeight(String rotationxy,double houseWideOn,double houseWideUnder,double houseLengthLeft,double houseLengthRight,double houseHight) {
|
|
171
|
185
|
|
|
172
|
186
|
List<Double> zList = new ArrayList<Double>();
|
|
173
|
187
|
|
|
174
|
|
- //返回的结果集
|
|
175
|
|
- //String rotationxy ="";
|
|
176
|
188
|
//垂直角度
|
|
177
|
189
|
double verticalAngle = 0;
|
|
178
|
190
|
//水平角度
|
|
|
@@ -191,19 +203,19 @@ public class SquareAlg {
|
|
191
|
203
|
double x = 0;
|
|
192
|
204
|
//真实的点的纵坐标的距离
|
|
193
|
205
|
double y = 0;
|
|
194
|
|
- //加0.5后的横纵坐标
|
|
|
206
|
+ //加一个边界值后的横纵坐标
|
|
195
|
207
|
double x1 = 0;
|
|
196
|
208
|
double y1 = 0;
|
|
197
|
209
|
//以粮面为基准面的高
|
|
198
|
|
- double zHigh = 0;
|
|
|
210
|
+ //double zHigh = 0;
|
|
199
|
211
|
|
|
200
|
212
|
double oa = houseLengthLeft; //x的左半轴(长)
|
|
201
|
213
|
double ob = houseWideOn; //y的上半轴(宽)
|
|
202
|
214
|
double oc = houseLengthRight; //x的右半轴(长)
|
|
203
|
215
|
double od = houseWideUnder; //y的下半轴(宽)
|
|
204
|
216
|
|
|
205
|
|
- //基数 51
|
|
206
|
|
- BigDecimal baseNumber = new BigDecimal(51);
|
|
|
217
|
+ //基数
|
|
|
218
|
+ BigDecimal baseNumber = new BigDecimal(basicData);
|
|
207
|
219
|
|
|
208
|
220
|
String[] split = rotationxy.split(";");
|
|
209
|
221
|
for (int i = 0; i < split.length; i++) {
|
|
|
@@ -217,67 +229,75 @@ public class SquareAlg {
|
|
217
|
229
|
* 去掉打在墙上的点(计算正式的点的坐标,横纵坐标只要有一个>(边-0.5)即为墙上的点)
|
|
218
|
230
|
*/
|
|
219
|
231
|
|
|
220
|
|
- String verticalAngleS = String.format("%.2f%n", Math.sin(Math.abs(verticalAngle)));
|
|
221
|
|
- double verticalSinc = new Double(verticalAngleS);
|
|
222
|
|
- //即 平面三角形的斜边
|
|
223
|
|
- A1B1 = realHypotenuse * verticalSinc;
|
|
|
232
|
+ //将垂直的角度转化为弧度
|
|
|
233
|
+ double verticalAngleRadians = Math.toRadians(verticalAngle);
|
|
|
234
|
+ //垂直角度的sin
|
|
|
235
|
+ String verticalAngleS = String.format("%.2f%n", Math.sin(verticalAngleRadians));
|
|
|
236
|
+ double sinVerticalAngle = new Double(verticalAngleS);
|
|
|
237
|
+ //垂直角度的cos
|
|
|
238
|
+ String verticalC = String.format("%.2f%n", Math.cos(Math.abs(verticalAngleRadians)));
|
|
|
239
|
+ double cosVertical = new Double(verticalC);
|
|
224
|
240
|
|
|
225
|
|
-
|
|
226
|
|
- String levelSinStr = String.format("%.2f%n", Math.sin(Math.abs(levelAngle)));
|
|
227
|
|
- double levelSina = new Double(levelSinStr);
|
|
|
241
|
+ //将水平的角度转化为弧度
|
|
|
242
|
+ double levelAngleRadians = Math.toRadians(levelAngle);
|
|
|
243
|
+ //水平角度的sin
|
|
|
244
|
+ String levelSinStr = String.format("%.2f%n", Math.sin(Math.abs(levelAngleRadians)));
|
|
|
245
|
+ double sinLevelAngle = new Double(levelSinStr);
|
|
|
246
|
+ //水平角度的cos
|
|
|
247
|
+ String levelCosStr = String.format("%.2f%n", Math.cos(Math.abs(levelAngleRadians)));
|
|
|
248
|
+ double cosLevelAngle = new Double(levelCosStr);
|
|
228
|
249
|
|
|
229
|
|
- String levelCosStr = String.format("%.2f%n", Math.cos(Math.abs(levelAngle)));
|
|
230
|
|
- double levelCosa = new Double(levelCosStr);
|
|
|
250
|
+ //平面三角形的斜边
|
|
|
251
|
+ A1B1 = realHypotenuse * sinVerticalAngle;
|
|
231
|
252
|
|
|
232
|
|
- //横坐标的距离
|
|
233
|
|
- x = A1B1 * levelCosa;
|
|
234
|
|
- //纵坐标的距离
|
|
235
|
|
- y = A1B1 * levelSina;
|
|
|
253
|
+ //横坐标的距离(只有长度)
|
|
|
254
|
+ x = Math.abs(A1B1 * cosLevelAngle ) ;
|
|
|
255
|
+ //纵坐标的距离(只有长度)
|
|
|
256
|
+ y = Math.abs(A1B1 * sinLevelAngle ) ;
|
|
236
|
257
|
|
|
237
|
258
|
//判断真实的坐标与长宽的距离
|
|
238
|
259
|
//四面都减少0.5米做安全隔墙 只要不在这范围的都算打在墙上(真实的坐标的距离都加0.5小于实际的边即可)
|
|
239
|
260
|
|
|
|
261
|
+ //加0.5后的横纵坐标的距离
|
|
|
262
|
+ x1 = x + boundaryValue;
|
|
|
263
|
+ y1 = y + boundaryValue;
|
|
240
|
264
|
|
|
241
|
|
- //加0.5后的横纵坐标
|
|
242
|
|
- x1 = x + 0.5;
|
|
243
|
|
- y1 = y + 0.5;
|
|
244
|
|
-
|
|
245
|
|
- String verticalC = String.format("%.2f%n", Math.cos(Math.abs(verticalAngle)));
|
|
246
|
|
- double verticalCosc = new Double(verticalC);
|
|
|
265
|
+
|
|
247
|
266
|
//A1C 是粮面点到设备的垂直距离
|
|
248
|
|
- double A1C = realHypotenuse * verticalCosc;
|
|
|
267
|
+ double A1C = realHypotenuse * cosVertical;
|
|
|
268
|
+ double z = houseHight - A1C;
|
|
249
|
269
|
|
|
250
|
270
|
if(levelAngle < 0 && verticalAngle>0 ){
|
|
251
|
271
|
//第一区域
|
|
252
|
272
|
if(x1<oa && y1<ob){
|
|
253
|
|
- zList.add(A1C);
|
|
|
273
|
+ zList.add(z);
|
|
254
|
274
|
}
|
|
255
|
275
|
}else if(levelAngle > 0 && verticalAngle>0){
|
|
256
|
276
|
//第二区域
|
|
257
|
277
|
if(x1<oc && y1<ob){
|
|
258
|
|
- zList.add(A1C);
|
|
|
278
|
+ zList.add(z);
|
|
259
|
279
|
}
|
|
260
|
280
|
|
|
261
|
281
|
}else if(levelAngle > 0 && verticalAngle<0){
|
|
262
|
282
|
//第三区域
|
|
263
|
283
|
if(x1<oa && y1<od){
|
|
264
|
|
- zList.add(A1C);
|
|
|
284
|
+ zList.add(z);
|
|
265
|
285
|
}
|
|
266
|
286
|
|
|
267
|
287
|
}else if(levelAngle < 0 && verticalAngle<0){
|
|
268
|
288
|
//第四区域
|
|
269
|
289
|
if(x1<oc && y1<od){
|
|
270
|
|
- zList.add(A1C);
|
|
|
290
|
+ zList.add(z);
|
|
271
|
291
|
}
|
|
272
|
292
|
}else if(levelAngle == 0 || levelAngle == -90 || levelAngle == 90){
|
|
273
|
|
- //
|
|
|
293
|
+ //坐标轴上的点
|
|
274
|
294
|
if(verticalAngle>0){
|
|
275
|
295
|
if(y1<ob){
|
|
276
|
|
- zList.add(A1C);
|
|
|
296
|
+ zList.add(z);
|
|
277
|
297
|
}
|
|
278
|
298
|
}else if(verticalAngle<0){
|
|
279
|
299
|
if(y1<od){
|
|
280
|
|
- zList.add(A1C);
|
|
|
300
|
+ zList.add(z);
|
|
281
|
301
|
}
|
|
282
|
302
|
}
|
|
283
|
303
|
}
|
|
|
@@ -290,6 +310,14 @@ public class SquareAlg {
|
|
290
|
310
|
|
|
291
|
311
|
|
|
292
|
312
|
/**
|
|
293
|
|
- * 去除打在墙上的点
|
|
|
313
|
+ * 计算体积---------------todo
|
|
|
314
|
+ *
|
|
|
315
|
+ * @param zList 粮面高集合(z值的集合)
|
|
294
|
316
|
*/
|
|
|
317
|
+ public static double calculateVolume(List<Double> zList,double houseWideOn,double houseWideUnder,double houseLengthLeft,double houseLengthRight,double houseHight) {
|
|
|
318
|
+ double v = 0;
|
|
|
319
|
+ return v;
|
|
|
320
|
+ }
|
|
|
321
|
+
|
|
|
322
|
+
|
|
295
|
323
|
}
|