質問編集履歴

2

プログラムの追加

2019/05/04 07:28

投稿

namekuhito
namekuhito

スコア21

test CHANGED
File without changes
test CHANGED
@@ -28,6 +28,474 @@
28
28
 
29
29
 
30
30
 
31
+ #define MAX_NUMBER 1000
32
+
33
+ #define FLAG_OFF 0
34
+
35
+ #define FLAG_ON 1
36
+
37
+ #define EPS 0.000001
38
+
39
+ #define V_NO_ERROR 0
40
+
41
+ #define V_ERROR 1
42
+
43
+
44
+
45
+ typedef struct {
46
+
47
+ double x, y;
48
+
49
+ int flag;
50
+
51
+ }POINT;
52
+
53
+
54
+
55
+ POINT p[MAX_NUMBER];
56
+
57
+ int number_of_points;
58
+
59
+
60
+
61
+ int find_point_with_minimum_x(void);
62
+
63
+
64
+
65
+ void make_2d_convex_hull(void);
66
+
67
+ void take_coordinate_of_point(int point_number, double v[]);
68
+
69
+ void determine_direction_of_base_line(double uv[], int point1, int point2);
70
+
71
+ void sort_using_distance(int ct[], int n, int p);
72
+
73
+ void vsub_(double v[], double v1[], double v2[], int *n);
74
+
75
+ void vunit_(double v[], double v0[], int *n, int *ierror);
76
+
77
+ double vinpro_(double v1[], double v2[], int *n);
78
+
79
+
80
+
81
+ int main(void)
82
+
83
+ {
84
+
85
+ FILE *fp;
86
+
87
+ int i = 0;
88
+
89
+ int point_number;
90
+
91
+ int n = 2;
92
+
93
+ double v1[2], v2[2], v[2];
94
+
95
+ double d;
96
+
97
+ errno_t err;
98
+
99
+
100
+
101
+ /*点データの入力*/
102
+
103
+ if ((err = fopen_s(&fp,"point_table.dat.txt", "r")) == '0') {
104
+
105
+ printf("cannot open point_table.dat\n");
106
+
107
+ return 0;
108
+
109
+ }
110
+
111
+ while (fscanf_s(fp, "%lf%lf", &p[i].x, &p[i].y) != EOF) {
112
+
113
+ p[i].flag = FLAG_OFF;
114
+
115
+ i++;
116
+
117
+ }
118
+
119
+ fclose(fp);
120
+
121
+ /*点の数の設定*/
122
+
123
+ number_of_points = i;
124
+
125
+
126
+
127
+ /*点データの出力*/
128
+
129
+ for (i = 0; i < number_of_points; i++) {
130
+
131
+ printf("%3d %7.3lf %7.3lf %d\n", i, p[i].x, p[i].y, p[i].flag);
132
+
133
+ }
134
+
135
+ /*2次元コンベックスハルの生成*/
136
+
137
+ make_2d_convex_hull();
138
+
139
+
140
+
141
+ return 0;
142
+
143
+ }
144
+
145
+
146
+
147
+ void make_2d_convex_hull(void)
148
+
149
+ {
150
+
151
+ int start_point;
152
+
153
+ int convex_point;
154
+
155
+ int number_of_convex_points = 0;
156
+
157
+ int cp[MAX_NUMBER];/*凸多角形を構成する点の並び*/
158
+
159
+ int ctemp[10];
160
+
161
+ int count;
162
+
163
+ int n = 2;
164
+
165
+ int ierror;
166
+
167
+ int i, k;
168
+
169
+ double v0[2], v1[2], v2[2], v[2], uv[2];
170
+
171
+ double d, dmax;
172
+
173
+
174
+
175
+ /*座標が最小の点を求める*/
176
+
177
+ convex_point = find_point_with_minimum_x();
178
+
179
+ printf("凸多角形を構成する1番目の点:%d\n", convex_point);
180
+
181
+ start_point = convex_point;
182
+
183
+ cp[number_of_convex_points] = convex_point;
184
+
185
+ number_of_convex_points++;
186
+
187
+
188
+
189
+ /*基準線の方向を設定する(y軸の負の方向)*/
190
+
191
+ uv[0] = 0.0; uv[1] = -1.0;
192
+
193
+ /*凸多角形を構成する2番目以降の点を求める*/
194
+
195
+ while (1) {
196
+
197
+ take_coordinate_of_point(convex_point, v1);
198
+
199
+ k = convex_point;
200
+
201
+ dmax = -1.0;
202
+
203
+ for (i = 0; i < number_of_points; i++) {
204
+
205
+ if (i != convex_point || p[i].flag == FLAG_OFF) {
206
+
207
+ take_coordinate_of_point(i, v2);
208
+
209
+ vsub_(v0, v2, v1, &n);
210
+
211
+ vunit_(v, v0, &n, &ierror);
212
+
213
+ d = vinpro_(uv, v, &n);
214
+
215
+ if (fabs(dmax - d) < EPS) {
216
+
217
+ ctemp[count] = i;
218
+
219
+ count++;
220
+
221
+ }
222
+
223
+ else if (dmax < d) {
224
+
225
+ dmax = d;
226
+
227
+ k = i;
228
+
229
+ ctemp[0] = i;
230
+
231
+ count = 1;
232
+
233
+ }
234
+
235
+ }
236
+
237
+ }
238
+
239
+ if (count >= 2) {
240
+
241
+ /*距離を用いて点を並び替える*/
242
+
243
+ sort_using_distance(ctemp, count, convex_point);
244
+
245
+ for (i = 0; i < count; i++) {
246
+
247
+ convex_point = ctemp[i];
248
+
249
+ p[convex_point].flag = FLAG_ON;
250
+
251
+ cp[number_of_convex_points] = convex_point;
252
+
253
+ number_of_convex_points++;
254
+
255
+ printf("凸多角形を構成する%d番目の点:%d\n", number_of_convex_points, convex_point);
256
+
257
+ }
258
+
259
+ }
260
+
261
+ else {
262
+
263
+ convex_point = k;
264
+
265
+ p[convex_point].flag = FLAG_ON;
266
+
267
+ cp[number_of_convex_points] = convex_point;
268
+
269
+ number_of_convex_points++;
270
+
271
+ printf("凸多角形を構成する%d番目の点:%d\n", number_of_convex_points, convex_point);
272
+
273
+ }
274
+
275
+ /*最初の点の戻れば終了*/
276
+
277
+ if (convex_point == start_point)break;
278
+
279
+ /*基準線の方向を設定する*/
280
+
281
+ determine_direction_of_base_line(uv, cp[number_of_convex_points - 2], convex_point);
282
+
283
+ }
284
+
285
+ }
286
+
287
+
288
+
289
+ void take_coordinate_of_point(int point_number, double v[])
290
+
291
+ {
292
+
293
+ v[0] = p[point_number].x;
294
+
295
+ v[1] = p[point_number].y;
296
+
297
+
298
+
299
+ }
300
+
301
+
302
+
303
+ int find_point_with_minimum_x(void)
304
+
305
+ {
306
+
307
+ int point_number;
308
+
309
+ int i;
310
+
311
+ double min;
312
+
313
+
314
+
315
+ point_number = 0;
316
+
317
+ min = p[0].x;
318
+
319
+ for (i = 1; i < number_of_points; i++) {
320
+
321
+ if (min > p[i].x) {
322
+
323
+ min = p[i].x;
324
+
325
+ point_number = i;
326
+
327
+ }
328
+
329
+ }
330
+
331
+ return point_number;
332
+
333
+ }
334
+
335
+
336
+
337
+ void determine_direction_of_base_line(double uv[], int point1, int point2)
338
+
339
+ {
340
+
341
+ double v1[2], v2[2], v[2];
342
+
343
+ int n = 2;
344
+
345
+ int error;
346
+
347
+
348
+
349
+ take_coordinate_of_point(point1, v1);
350
+
351
+ take_coordinate_of_point(point2, v2);
352
+
353
+ vsub_(v, v2, v1, &n);
354
+
355
+ vunit_(uv, v, &n, &error);
356
+
357
+ }
358
+
359
+ void sort_using_distance(int ct[], int n ,int p)
360
+
361
+ {
362
+
363
+ int i, j, k;
364
+
365
+ double v1[2], v2[2];
366
+
367
+ double dist[10];
368
+
369
+ double d;
370
+
371
+ double min, temp1;
372
+
373
+ int temp2;
374
+
375
+
376
+
377
+ /*2点間の距離の計算*/
378
+
379
+ take_coordinate_of_point(p, v1);
380
+
381
+ for (i = 0; i < n; i++) {
382
+
383
+ take_coordinate_of_point(ct[i], v2);
384
+
385
+ d = 0.0;
386
+
387
+ for (j = 0; j < 2; j++) {
388
+
389
+ d += (v2[j] - v1[j])*(v2[j] - v1[j]);
390
+
391
+ }
392
+
393
+ dist[i] = sqrt(d);
394
+
395
+ }
396
+
397
+ /*距離の昇順に点を並び替える*/
398
+
399
+ for (i = 0; i < n - 1; i++) {
400
+
401
+ min = dist[i];
402
+
403
+ k = i;
404
+
405
+ for (j = i + 1; j < n; j++) {
406
+
407
+ if (dist[j] < min) {
408
+
409
+ min = dist[j];
410
+
411
+ k = j;
412
+
413
+ }
414
+
415
+ }
416
+
417
+ temp1 = dist[i];
418
+
419
+ dist[i] = dist[k];
420
+
421
+ dist[k] = temp1;
422
+
423
+ temp2 = ct[i];
424
+
425
+ ct[i] = ct[k];
426
+
427
+ ct[k] = temp2;
428
+
429
+ }
430
+
431
+ }
432
+
433
+
434
+
435
+ /*単位ベクトル*/
436
+
437
+ void vunit_(double v[], double v0[], int *n, int *ierror)
438
+
439
+ {
440
+
441
+ int i;
442
+
443
+ double d = 0.0;
444
+
445
+ *ierror = V_NO_ERROR;
446
+
447
+ for (i = 0; i < *n; i++)d += v0[i] * v0[i];
448
+
449
+ if (d < 0.00000001) {
450
+
451
+ *ierror = V_ERROR;
452
+
453
+ return;
454
+
455
+ }
456
+
457
+ d = sqrt(d);
458
+
459
+ for (i = 0; i < *n; i++) v[i] = v0[i] / d;
460
+
461
+ return;
462
+
463
+ }
464
+
465
+
466
+
467
+ /*ベクトルの差*/
468
+
469
+ void vsub_(double v[], double v1[], double v2[], int *n)
470
+
471
+ {
472
+
473
+ int i;
474
+
475
+ for (i = 0; i < *n; i++)v[i] = v1[i] - v2[i];
476
+
477
+ return;
478
+
479
+ }
480
+
481
+
482
+
483
+ /*内積*/
484
+
485
+ double vinpro_(double v1[], double v2[], int *n)
486
+
487
+ {
488
+
489
+ int i;
490
+
491
+ double t = 0.0;
492
+
493
+ for (i = 0; i < *n; i++) t+= v1[i] * v2[i];
494
+
495
+ return t;
496
+
497
+ }
498
+
31
499
  ```
32
500
 
33
501
 

1

書き足した

2019/05/04 07:28

投稿

namekuhito
namekuhito

スコア21

test CHANGED
File without changes
test CHANGED
@@ -42,6 +42,4 @@
42
42
 
43
43
  ### 補足情報(FW/ツールのバージョンなど)
44
44
 
45
-
46
-
47
- より詳細な情報を記載しい。
45
+ のエラーメッセージつい教えていたきたです