質問編集履歴

2

文章を編集

2019/12/10 15:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  1、ブロック(64,64)の座標をどうやって手に入れるか?
4
4
 
5
+
6
+
5
7
  2、参考サイトの真ん中より下の方のスライドの[4っの端点に対して、線分のどちら側にあるのかを判定すればいい]スライド部の
6
8
 
7
9
  ベクトル外積を計算して掛け算していますがこれを "プログラム上"でどうすればいいかわかりません。
@@ -24,6 +26,14 @@
24
26
 
25
27
 
26
28
 
29
+ 追記 提示コードのネットから拾った版と自作版とで少し処理の書き方違うのですがこれはなぜでしょうか?
30
+
31
+ また自分が作った自作版の処理は正しいのでしょうか?
32
+
33
+
34
+
35
+
36
+
27
37
  参考サイト: http://www.zengeren.com/content/data/05/05_2DCollision.pdf
28
38
 
29
39
 
@@ -64,7 +74,9 @@
64
74
 
65
75
  }
66
76
 
77
+
78
+
67
- //ベクルの交差判定
79
+ //ネッから拾った。
68
80
 
69
81
  static bool vec_test(float ax,float ay,float bx,float by,float cx,float cy,float dx,float dy)
70
82
 
@@ -80,34 +92,260 @@
80
92
 
81
93
 
82
94
 
83
- var td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);///////
95
+ var td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);
96
+
97
+
98
+
84
-
99
+ Console.WriteLine("a: " + tc * td);
100
+
85
-
101
+ Console.WriteLine("b: " + ta * tb);
102
+
103
+
104
+
105
+ if(tc * td <= 0.0f && ta * tb <= 0.0f)
106
+
107
+ {
108
+
109
+ return true;
110
+
111
+ }
112
+
113
+ else
114
+
115
+ {
116
+
117
+ return false;
118
+
119
+ }
120
+
121
+
122
+
123
+
124
+
125
+ }
126
+
127
+
128
+
129
+ /*自作版*/
130
+
131
+ /*高速の当たり判定に対応した版*/
132
+
133
+ static bool cross_col(Position A,Position B,Position C,Position D)
134
+
135
+ {
136
+
137
+ Position AB,AC,AD,CA,CD,CB;
138
+
139
+ AB = new Position();
140
+
141
+ AC = new Position();
142
+
143
+ AD = new Position();
144
+
145
+ CA = new Position();
146
+
147
+ CD = new Position();
148
+
149
+ CB = new Position();
150
+
151
+
152
+
153
+ /*線分を作る*/
154
+
155
+ AB.x = B.x - A.x;
156
+
157
+ AB.y = B.y - A.y;
158
+
159
+
160
+
161
+ AC.x = C.x - A.x;
162
+
163
+ AC.y = C.y - A.y;
164
+
165
+
166
+
167
+ AD.x = D.x - A.x;
168
+
169
+ AD.y = D.y - A.y;
170
+
171
+
172
+
173
+ CA.x = A.x - C.x;
174
+
175
+ CA.y = A.y - C.y;
176
+
177
+
178
+
179
+ CD.x = D.x - C.x;
180
+
181
+ CD.y = D.y - C.y;
182
+
183
+
184
+
185
+ CB.x = B.x - C.x;
186
+
187
+ CB.y = B.y - C.y;
188
+
189
+
190
+
191
+ /*ベクトル外積の公式 (A x B) = x0 * y1 - x1 * y0 */
192
+
193
+ float AB_AC = (AB.x * AC.y) - (AC.x * AB.y);
194
+
195
+
196
+
197
+ float AB_AD = (AB.x * AD.y) - (AD.x * AB.y);
198
+
199
+
200
+
201
+ float CD_CA = (CD.x * CA.y) - (CA.x * CD.y);
202
+
203
+
204
+
205
+ float CD_CB = (CD.x * CB.y) - (CB.x * CD.y);
206
+
207
+
208
+
209
+ float a = AB_AC * AB_AD;
210
+
211
+ float b = CD_CA * CD_CB;
212
+
213
+
214
+
215
+ Console.WriteLine("a: " + a);
216
+
217
+ Console.WriteLine("b: " + b);
218
+
219
+
220
+
221
+ if(a <= 0.0 != b <= 0.0)
222
+
223
+ {
224
+
225
+ return true;
226
+
227
+ }else{
228
+
229
+ return false;
230
+
231
+ }
232
+
233
+ }
234
+
235
+
236
+
237
+ static void Main(string[] args)
238
+
239
+ {
240
+
241
+
242
+
243
+ Position a = new Position();
244
+
245
+ Position b = new Position();
246
+
247
+ Position c = new Position();
248
+
249
+ Position d = new Position();
250
+
251
+
252
+
253
+ Console.Write("a.x: ");
254
+
255
+ a.x = int.Parse(Console.ReadLine());
256
+
257
+ Console.Write("a.y: ");
258
+
259
+ a.y = int.Parse(Console.ReadLine());
260
+
261
+ Console.WriteLine();
262
+
263
+
264
+
265
+ Console.Write("b.x: ");
266
+
267
+ b.x = int.Parse(Console.ReadLine());
268
+
269
+ Console.Write("b.y: ");
270
+
271
+ b.y = int.Parse(Console.ReadLine());
272
+
273
+ Console.WriteLine();
274
+
275
+
276
+
277
+ Console.Write("c.x: ");
278
+
279
+ c.x = int.Parse(Console.ReadLine());
280
+
281
+ Console.Write("c.y: ");
282
+
283
+ c.y = int.Parse(Console.ReadLine());
284
+
285
+ Console.WriteLine();
286
+
287
+
288
+
289
+ Console.Write("d.x: ");
290
+
291
+ d.x = int.Parse(Console.ReadLine());
292
+
293
+ Console.Write("d.y: ");
294
+
295
+ d.y = int.Parse(Console.ReadLine());
296
+
297
+ Console.WriteLine();
298
+
299
+
300
+
301
+ if(cross_col(a,b,c,d) == true)
302
+
303
+ {
304
+
305
+ Console.WriteLine("交差します。!");
306
+
307
+ }else{
308
+
309
+ Console.WriteLine("交差していません");
310
+
311
+ }
312
+
313
+
314
+
315
+ Console.WriteLine();
316
+
317
+ Console.WriteLine();
318
+
319
+
320
+
321
+ Console.WriteLine("以下ネットのコピペ版");
322
+
323
+ if(vec_test(a.x,a.y,b.x,b.y,c.x,c.y,d.x,d.y) == true)
324
+
325
+ {
326
+
327
+
328
+
329
+ Console.WriteLine("交差しています。");
330
+
331
+ }
332
+
333
+ else
334
+
335
+ {
336
+
337
+ Console.WriteLine("交差しています。");
338
+
339
+ }
86
340
 
87
341
 
88
342
 
89
- if(tc * td <= 0.0f && ta * tb <= 0.0f)
90
-
91
- {
92
-
93
- return true;
94
-
95
- }
96
-
97
- else
98
-
99
- {
100
-
101
- return false;
102
-
103
- }
104
-
105
-
106
-
107
-
108
-
109
343
  }
110
344
 
345
+ }
346
+
347
+ }
348
+
111
349
 
112
350
 
113
351
  ```

1

文章を編集

2019/12/10 15:49

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,9 +2,23 @@
2
2
 
3
3
  1、ブロック(64,64)の座標をどうやって手に入れるか?
4
4
 
5
+ 2、参考サイトの真ん中より下の方のスライドの[4っの端点に対して、線分のどちら側にあるのかを判定すればいい]スライド部の
6
+
5
- 2、参考サイトではベクトル外積を計算していますがプログラム上でどうすればいいかわかりません。
7
+ ベクトル外積を計算して掛け算していますがこれを "プログラム上"でどうすればいいかわかりません。
8
+
9
+ (AB×AC)*(AB× AD) <= 0.0 &&
10
+
11
+ (CD×CA)*(CD× CB) <= 0.0
12
+
13
+
6
14
 
7
15
  3、止まっている物体とプレイヤーの場合止まっている物体のベクトルの向きはどの向きにすればいいのか?
16
+
17
+ この場合はc Dの点線分ベクトルがブロックの場合は?
18
+
19
+
20
+
21
+ 4、提示コードは調べて出てきたものなのですがこれはスライドの計算をプログラム上で計算していると思われるのですがなぜ真ん中で足し算しているのでしょうか?外積のクロス式を見ると - していますが(スライド上部)
8
22
 
9
23
 
10
24
 
@@ -18,41 +32,81 @@
18
32
 
19
33
  ```ここに言語を入力
20
34
 
35
+ using System;
21
36
 
37
+ namespace ConsoleApp3
22
38
 
23
- /*---------------------------------------------------当たり判定----------------------------------------------------------------*/
39
+ {
24
40
 
25
- void Collision_Update()
41
+ class Program
26
42
 
27
- {
43
+ {
28
44
 
29
- std::unique_ptr<Position> future(std::make_unique<Position>());
45
+ class Position
46
+
47
+ {
48
+
49
+ public float x;
50
+
51
+ public float y;
30
52
 
31
53
 
32
54
 
33
- future->x = pos->x + move->x;//プレイヤー
55
+ public Position(float xx = 0.0f,float yy = 0.0f)
34
56
 
57
+ {
58
+
59
+ x = xx;
60
+
61
+ y = yy;
62
+
63
+ }
64
+
65
+ }
66
+
67
+ //ベクトルの交差判定
68
+
69
+ static bool vec_test(float ax,float ay,float bx,float by,float cx,float cy,float dx,float dy)
70
+
71
+ {
72
+
73
+
74
+
35
- future->y = pos->y + move->y;
75
+ var ta = (cx - dx) * (ay - cy) + (cy - dy) * (cx - ax);
76
+
77
+ var tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx);
78
+
79
+ var tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx);
36
80
 
37
81
 
38
82
 
39
- //Position p = () - ();
83
+ var td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);///////
40
84
 
41
85
 
42
86
 
87
+
88
+
89
+ if(tc * td <= 0.0f && ta * tb <= 0.0f)
90
+
91
+ {
92
+
93
+ return true;
94
+
95
+ }
96
+
97
+ else
98
+
99
+ {
100
+
101
+ return false;
102
+
103
+ }
43
104
 
44
105
 
45
106
 
107
+
46
108
 
47
-
48
-
49
- *pos = *future;
50
-
51
- }
109
+ }
52
-
53
- /*-------------------------------------------------------------------------------------------------------------------------*/
54
-
55
-
56
110
 
57
111
 
58
112