質問編集履歴

4

タイトルと内容を編集しました。

2019/12/14 13:50

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- 外積を使って当たり判定のすり抜けを修正するコードで"交点座標"値の計算が合わない原因が知りたい
1
+ 外積を使って当たり判定のすり抜けを修正するコードでベクトル割り算とはどうすれば計算できるのか?
test CHANGED
@@ -1,371 +1,75 @@
1
- タイトル通り高速で例えば400pxを一フレームの間に移動すると壁に当たらずすり抜けてしまうバグの修正法としてベクトルの外積などを使ったすり抜け防止プログラムのコード交点座標がバグ。何が悪いのでしょうか?
1
+ タイトル通り高速で例えば400pxを一フレームの間に移動すると壁に当たらずすり抜けてしまうバグの修正法としてベクトルの外積などを使ったすり抜け防止プログラムを書くために数学上で手計算をしているのすがベクトル通し算とはどうればのでしょうか?調べてみると割り算がそもそもできないらしいのですがこのコードでは割り算の / 記号がるため困っています。
2
+
3
+ 参考サイト下部のコードのコメント部 k = BD×AB / (BD×AB + BD×BC);です
4
+
5
+ 掛け算はそれぞれの成分同士でやれたしても割り算はわかりません。これはどうすればいいのでしょうか?
2
6
 
3
7
 
4
8
 
5
- 交点 = A +ベクルAB * t1 / (t1 + t2)
9
+ 参考サイ: http://www.fumiononaka.com/Business/html5/FN1312004.html
6
10
 
7
11
 
8
12
 
9
- 各座標は プレヤ A(384,320),B(648,320), ブロックC(448,300),D(448,384)
13
+ 参考サトのコード
10
14
 
15
+ ```ここに言語を入力
16
+
17
+ function getIntersection(from_0, to_0, from_1, to_1) {
18
+
11
- ちなみに 交点座標: 259.7647 , 320 また 衝突しています!と出力されます。
19
+ var intersection = new createjs.Point();
20
+
21
+ // AC
22
+
23
+ var vector_0 = new createjs.Point(to_0.x - from_0.x, to_0.y - from_0.y);
24
+
25
+ // BD
26
+
27
+ var vector_1 = new createjs.Point(to_1.x - from_1.x, to_1.y - from_1.y);
28
+
29
+ // AB
30
+
31
+ var vector_2 = new createjs.Point(from_1.x - from_0.x, from_1.y - from_0.y);
32
+
33
+ // BC
34
+
35
+ var vector_3 = new createjs.Point(to_0.x - from_1.x, to_0.y - from_1.y);
36
+
37
+ // BD×AB
38
+
39
+ var area_0 = crossProduct2D(vector_1, vector_2);
40
+
41
+ // BD×BC
42
+
43
+ var area_1 = crossProduct2D(vector_1, vector_3);
44
+
45
+ // BD×AB + BD×BC
46
+
47
+ var area_total = area_0 + area_1;
48
+
49
+ if (Math.abs(area_total) >= 1) {
50
+
51
+ // k = BD×AB / (BD×AB + BD×BC)
52
+
53
+ var ratio = area_0 / area_total;
12
54
 
13
55
 
14
56
 
15
- 左から当たった右から当たったとかいろいろ細かい話があるみたいですがとりえず自分はX軸に右動いた時だけの場合を考えて処理を考えました。
57
+ // x = ax + k×(cx - ax)
16
58
 
59
+ intersection.x = from_0.x + ratio * vector_0.x;
17
60
 
61
+ // y = ay + k×(cy - ay)
18
62
 
19
- 参考サイト: 全体の中心より下の方です。2. 線分が交差する場合の交差座標のスライド部
63
+ intersection.y = from_0.y + ratio * vector_0.y;
20
64
 
21
- http://www.zengeren.com/content/data/05/05_2DCollision.pdf
65
+ return {intersection:intersection, crossed:crossed};
22
66
 
67
+ } else {
23
68
 
69
+ return null;
24
70
 
25
- ![![イメージ説明](89a700e5caa3a31a3a7c57fa152223b8.png)]
26
-
27
-
28
-
29
- ```ここに言語を入力
30
-
31
- using System;
32
-
33
- namespace ConsoleApp3
34
-
35
- {
36
-
37
- class Program
38
-
39
- {
40
-
41
- class Position
42
-
43
- {
44
-
45
- public float x;
46
-
47
- public float y;
48
-
49
-
50
-
51
- public Position(float xx = 0.0f,float yy = 0.0f)
52
-
53
- {
54
-
55
- x = xx;
56
-
57
- y = yy;
58
-
59
- }
71
+ }
60
-
61
- }
62
-
63
-
64
-
65
- //ネットから拾った。
66
-
67
- static bool vec_test(float ax,float ay,float bx,float by,float cx,float cy,float dx,float dy)
68
-
69
- {
70
-
71
-
72
-
73
- var ta = (cx - dx) * (ay - cy) + (cy - dy) * (cx - ax);
74
-
75
- var tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx);
76
-
77
- var tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx);
78
-
79
-
80
-
81
- var td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);
82
-
83
-
84
-
85
- Console.WriteLine("a: " + tc * td);
86
-
87
- Console.WriteLine("b: " + ta * tb);
88
-
89
-
90
-
91
- if(tc * td <= 0.0f && ta * tb <= 0.0f)
92
-
93
- {
94
-
95
- return true;
96
-
97
- }
98
-
99
- else
100
-
101
- {
102
-
103
- return false;
104
-
105
- }
106
-
107
-
108
-
109
-
110
-
111
- }
112
-
113
-
114
-
115
- /*自作版*/
116
-
117
- /*高速の当たり判定に対応した版*/
118
-
119
- static void cross_col(Position A,Position B,Position C,Position D)
120
-
121
- {
122
-
123
- Position AB,AC,AD,CA,CD,CB;
124
-
125
- AB = new Position();
126
-
127
- AC = new Position();
128
-
129
- AD = new Position();
130
-
131
- CA = new Position();
132
-
133
- CD = new Position();
134
-
135
- CB = new Position();
136
-
137
-
138
-
139
- /*線分の公式 b - A */
140
-
141
- AB.x = B.x - A.x;
142
-
143
- AB.y = B.y - A.y;
144
-
145
-
146
-
147
- AC.x = C.x - A.x;
148
-
149
- AC.y = C.y - A.y;
150
-
151
-
152
-
153
- AD.x = D.x - A.x;
154
-
155
- AD.y = D.y - A.y;
156
-
157
-
158
-
159
- CA.x = A.x - C.x;
160
-
161
- CA.y = A.y - C.y;
162
-
163
-
164
-
165
- CD.x = D.x - C.x;
166
-
167
- CD.y = D.y - C.y;
168
-
169
-
170
-
171
- CB.x = B.x - C.x;
172
-
173
- CB.y = B.y - C.y;
174
-
175
-
176
-
177
- /*ベクトル外積の公式 (A x B) = x0 * y1 - x1 * y0 */
178
-
179
- float AB_AC = (AB.x * AC.y) - (AC.x * AB.y);
180
-
181
-
182
-
183
- float AB_AD = (AB.x * AD.y) - (AD.x * AB.y);
184
-
185
-
186
-
187
- float CA_CD = (CA.x * CD.y) - (CD.x * CA.y);
188
-
189
-
190
-
191
- float CB_CD = (CB.x * CD.y) - (CD.x * CB.y);
192
-
193
-
194
-
195
- float AB_CD = (AB.x * CD.y) - (CD.x * AB.y);
196
-
197
-
198
-
199
-
200
-
201
- /*交点座標の計算式 交点 = A + AB * ① / (① + ②) */
202
-
203
- float cc = (CA_CD + CB_CD);//1 + 2
204
-
205
- float e = CA_CD / cc;
206
-
207
-
208
-
209
- Position vAB = new Position(AB.x * e,AB.y * e); // AB * 〇1
210
-
211
- Position pos = new Position(A.x + vAB.x , A.y + vAB.y);
212
-
213
-
214
-
215
- Console.WriteLine("交点座標: " + pos.x + " , " + pos.y);
216
-
217
-
218
-
219
-
220
-
221
- if(AB_CD == 0.0)//平行
222
-
223
- {
224
-
225
- Console.WriteLine("平行です。");
226
-
227
- // return false;
228
-
229
- }else{
230
-
231
- Console.WriteLine("衝突してます。!");
232
-
233
- //return true;
234
-
235
- }
236
-
237
-
238
-
239
- }
240
-
241
-
242
-
243
- static void Main(string[] args)
244
-
245
- {
246
-
247
-
248
-
249
- Position a = new Position();
250
-
251
- Position b = new Position();
252
-
253
- Position c = new Position();
254
-
255
- Position d = new Position();
256
-
257
-
258
-
259
- while(true)
260
-
261
- {
262
-
263
- Console.Write("a.x: ");
264
-
265
- a.x = int.Parse(Console.ReadLine());
266
-
267
- Console.Write("a.y: ");
268
-
269
- a.y = int.Parse(Console.ReadLine());
270
-
271
- Console.WriteLine();
272
-
273
-
274
-
275
- Console.Write("b.x: ");
276
-
277
- b.x = int.Parse(Console.ReadLine());
278
-
279
- Console.Write("b.y: ");
280
-
281
- b.y = int.Parse(Console.ReadLine());
282
-
283
- Console.WriteLine();
284
-
285
-
286
-
287
- Console.Write("c.x: ");
288
-
289
- c.x = int.Parse(Console.ReadLine());
290
-
291
- Console.Write("c.y: ");
292
-
293
- c.y = int.Parse(Console.ReadLine());
294
-
295
- Console.WriteLine();
296
-
297
-
298
-
299
- Console.Write("d.x: ");
300
-
301
- d.x = int.Parse(Console.ReadLine());
302
-
303
- Console.Write("d.y: ");
304
-
305
- d.y = int.Parse(Console.ReadLine());
306
-
307
- Console.WriteLine();
308
-
309
- Console.WriteLine();
310
-
311
- cross_col(a,b,c,d);
312
-
313
-
314
-
315
- Console.WriteLine();
316
-
317
- Console.WriteLine();
318
-
319
- Console.WriteLine();
320
-
321
-
322
-
323
- }
324
-
325
-
326
-
327
-
328
-
329
- Console.WriteLine();
330
-
331
- Console.WriteLine();
332
-
333
-
334
-
335
- Console.WriteLine("以下ネットのコピペ版");
336
-
337
- if(vec_test(a.x,a.y,b.x,b.y,c.x,c.y,d.x,d.y) == true)
338
-
339
- {
340
-
341
-
342
-
343
- Console.WriteLine("交差します。!");
344
-
345
- }
346
-
347
- else
348
-
349
- {
350
-
351
- Console.WriteLine("交差していません");
352
-
353
- }
354
-
355
-
356
-
357
-
358
-
359
-
360
-
361
- Console.ReadKey();
362
-
363
- }
364
-
365
- }
366
72
 
367
73
  }
368
74
 
369
-
370
-
371
75
  ```

3

なにも変更なし

2019/12/14 13:50

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- タイトル通り高速で例えば400pxを一フレームの間に移動すると壁に当たらずすり抜けてしまうバグの修正法としてベクトルの外積などを使ったすり抜け防止プログラムのコードで交点の座標がバグります。公式が悪いのでしょうか?
1
+ タイトル通り高速で例えば400pxを一フレームの間に移動すると壁に当たらずすり抜けてしまうバグの修正法としてベクトルの外積などを使ったすり抜け防止プログラムのコードで交点の座標がバグります。が悪いのでしょうか?
2
2
 
3
3
 
4
4
 

2

文章を編集

2019/12/12 13:26

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -16,6 +16,12 @@
16
16
 
17
17
 
18
18
 
19
+ 参考サイト: 全体の中心より下の方です。2. 線分が交差する場合の交差座標のスライド部
20
+
21
+ http://www.zengeren.com/content/data/05/05_2DCollision.pdf
22
+
23
+
24
+
19
25
  ![![イメージ説明](89a700e5caa3a31a3a7c57fa152223b8.png)]
20
26
 
21
27
 

1

文章を編集

2019/12/11 12:48

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -18,6 +18,8 @@
18
18
 
19
19
  ![![イメージ説明](89a700e5caa3a31a3a7c57fa152223b8.png)]
20
20
 
21
+
22
+
21
23
  ```ここに言語を入力
22
24
 
23
25
  using System;
@@ -360,4 +362,4 @@
360
362
 
361
363
 
362
364
 
363
- ``
365
+ ```