teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

文章を編集

2019/12/10 15:49

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,6 @@
1
1
  四角で縦横64,64px同士の当たり判定で100動いた時にすり抜けしまうバグを修正するためにベクトルの外積を使って回避するコードを組みたいです。困っているのは
2
2
  1、ブロック(64,64)の座標をどうやって手に入れるか?
3
+
3
4
  2、参考サイトの真ん中より下の方のスライドの[4っの端点に対して、線分のどちら側にあるのかを判定すればいい]スライド部の
4
5
  ベクトル外積を計算して掛け算していますがこれを "プログラム上"でどうすればいいかわかりません。
5
6
  (AB×AC)*(AB× AD) <= 0.0 &&
@@ -11,6 +12,10 @@
11
12
  4、提示コードは調べて出てきたものなのですがこれはスライドの計算をプログラム上で計算していると思われるのですがなぜ真ん中で足し算しているのでしょうか?外積のクロス式を見ると - していますが(スライド上部)
12
13
 
13
14
 
15
+ 追記 提示コードのネットから拾った版と自作版とで少し処理の書き方違うのですがこれはなぜでしょうか?
16
+ また自分が作った自作版の処理は正しいのでしょうか?
17
+
18
+
14
19
  参考サイト: http://www.zengeren.com/content/data/05/05_2DCollision.pdf
15
20
 
16
21
  ![イメージ説明](df9eb164a1ef22aa8446a4098c722049.png)
@@ -31,7 +36,8 @@
31
36
  y = yy;
32
37
  }
33
38
  }
39
+
34
- //ベクルの交差判定
40
+ //ネッから拾った。
35
41
  static bool vec_test(float ax,float ay,float bx,float by,float cx,float cy,float dx,float dy)
36
42
  {
37
43
 
@@ -39,9 +45,11 @@
39
45
  var tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx);
40
46
  var tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx);
41
47
 
42
- var td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);///////
48
+ var td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);
43
49
 
44
-
50
+ Console.WriteLine("a: " + tc * td);
51
+ Console.WriteLine("b: " + ta * tb);
52
+
45
53
  if(tc * td <= 0.0f && ta * tb <= 0.0f)
46
54
  {
47
55
  return true;
@@ -54,4 +62,115 @@
54
62
 
55
63
  }
56
64
 
65
+ /*自作版*/
66
+ /*高速の当たり判定に対応した版*/
67
+ static bool cross_col(Position A,Position B,Position C,Position D)
68
+ {
69
+ Position AB,AC,AD,CA,CD,CB;
70
+ AB = new Position();
71
+ AC = new Position();
72
+ AD = new Position();
73
+ CA = new Position();
74
+ CD = new Position();
75
+ CB = new Position();
76
+
77
+ /*線分を作る*/
78
+ AB.x = B.x - A.x;
79
+ AB.y = B.y - A.y;
80
+
81
+ AC.x = C.x - A.x;
82
+ AC.y = C.y - A.y;
83
+
84
+ AD.x = D.x - A.x;
85
+ AD.y = D.y - A.y;
86
+
87
+ CA.x = A.x - C.x;
88
+ CA.y = A.y - C.y;
89
+
90
+ CD.x = D.x - C.x;
91
+ CD.y = D.y - C.y;
92
+
93
+ CB.x = B.x - C.x;
94
+ CB.y = B.y - C.y;
95
+
96
+ /*ベクトル外積の公式 (A x B) = x0 * y1 - x1 * y0 */
97
+ float AB_AC = (AB.x * AC.y) - (AC.x * AB.y);
98
+
99
+ float AB_AD = (AB.x * AD.y) - (AD.x * AB.y);
100
+
101
+ float CD_CA = (CD.x * CA.y) - (CA.x * CD.y);
102
+
103
+ float CD_CB = (CD.x * CB.y) - (CB.x * CD.y);
104
+
105
+ float a = AB_AC * AB_AD;
106
+ float b = CD_CA * CD_CB;
107
+
108
+ Console.WriteLine("a: " + a);
109
+ Console.WriteLine("b: " + b);
110
+
111
+ if(a <= 0.0 != b <= 0.0)
112
+ {
113
+ return true;
114
+ }else{
115
+ return false;
116
+ }
117
+ }
118
+
119
+ static void Main(string[] args)
120
+ {
121
+
122
+ Position a = new Position();
123
+ Position b = new Position();
124
+ Position c = new Position();
125
+ Position d = new Position();
126
+
127
+ Console.Write("a.x: ");
128
+ a.x = int.Parse(Console.ReadLine());
129
+ Console.Write("a.y: ");
130
+ a.y = int.Parse(Console.ReadLine());
131
+ Console.WriteLine();
132
+
133
+ Console.Write("b.x: ");
134
+ b.x = int.Parse(Console.ReadLine());
135
+ Console.Write("b.y: ");
136
+ b.y = int.Parse(Console.ReadLine());
137
+ Console.WriteLine();
138
+
139
+ Console.Write("c.x: ");
140
+ c.x = int.Parse(Console.ReadLine());
141
+ Console.Write("c.y: ");
142
+ c.y = int.Parse(Console.ReadLine());
143
+ Console.WriteLine();
144
+
145
+ Console.Write("d.x: ");
146
+ d.x = int.Parse(Console.ReadLine());
147
+ Console.Write("d.y: ");
148
+ d.y = int.Parse(Console.ReadLine());
149
+ Console.WriteLine();
150
+
151
+ if(cross_col(a,b,c,d) == true)
152
+ {
153
+ Console.WriteLine("交差します。!");
154
+ }else{
155
+ Console.WriteLine("交差していません");
156
+ }
157
+
158
+ Console.WriteLine();
159
+ Console.WriteLine();
160
+
161
+ Console.WriteLine("以下ネットのコピペ版");
162
+ if(vec_test(a.x,a.y,b.x,b.y,c.x,c.y,d.x,d.y) == true)
163
+ {
164
+
165
+ Console.WriteLine("交差しています。");
166
+ }
167
+ else
168
+ {
169
+ Console.WriteLine("交差しています。");
170
+ }
171
+
172
+ }
173
+ }
174
+ }
175
+
57
176
  ```

1

文章を編集

2019/12/10 15:49

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,30 +1,57 @@
1
1
  四角で縦横64,64px同士の当たり判定で100動いた時にすり抜けしまうバグを修正するためにベクトルの外積を使って回避するコードを組みたいです。困っているのは
2
2
  1、ブロック(64,64)の座標をどうやって手に入れるか?
3
+ 2、参考サイトの真ん中より下の方のスライドの[4っの端点に対して、線分のどちら側にあるのかを判定すればいい]スライド部の
3
- 2、参考サイトではベクトル外積を計算していますがプログラム上でどうすればいいかわかりません。
4
+ ベクトル外積を計算して掛け算していますがこれを "プログラム上"でどうすればいいかわかりません。
5
+ (AB×AC)*(AB× AD) <= 0.0 &&
6
+ (CD×CA)*(CD× CB) <= 0.0
7
+
4
8
  3、止まっている物体とプレイヤーの場合止まっている物体のベクトルの向きはどの向きにすればいいのか?
9
+ この場合はc Dの点線分ベクトルがブロックの場合は?
5
10
 
11
+ 4、提示コードは調べて出てきたものなのですがこれはスライドの計算をプログラム上で計算していると思われるのですがなぜ真ん中で足し算しているのでしょうか?外積のクロス式を見ると - していますが(スライド上部)
6
12
 
13
+
7
14
  参考サイト: http://www.zengeren.com/content/data/05/05_2DCollision.pdf
8
15
 
9
16
  ![イメージ説明](df9eb164a1ef22aa8446a4098c722049.png)
10
17
  ```ここに言語を入力
18
+ using System;
19
+ namespace ConsoleApp3
20
+ {
21
+ class Program
22
+ {
23
+ class Position
24
+ {
25
+ public float x;
26
+ public float y;
11
27
 
12
- /*---------------------------------------------------当たり判定----------------------------------------------------------------*/
13
- void Collision_Update()
28
+ public Position(float xx = 0.0f,float yy = 0.0f)
14
- {
29
+ {
30
+ x = xx;
31
+ y = yy;
32
+ }
33
+ }
34
+ //ベクトルの交差判定
15
- std::unique_ptr<Position> future(std::make_unique<Position>());
35
+ static bool vec_test(float ax,float ay,float bx,float by,float cx,float cy,float dx,float dy)
36
+ {
37
+
38
+ var ta = (cx - dx) * (ay - cy) + (cy - dy) * (cx - ax);
39
+ var tb = (cx - dx) * (by - cy) + (cy - dy) * (cx - bx);
40
+ var tc = (ax - bx) * (cy - ay) + (ay - by) * (ax - cx);
16
41
 
17
- future->x = pos->x + move->x;//プレイヤー
42
+ var td = (ax - bx) * (dy - ay) + (ay - by) * (ax - dx);///////
18
- future->y = pos->y + move->y;
19
43
 
44
+
20
- //Position p = () - ();
45
+ if(tc * td <= 0.0f && ta * tb <= 0.0f)
46
+ {
47
+ return true;
48
+ }
49
+ else
50
+ {
51
+ return false;
52
+ }
21
53
 
54
+
55
+ }
22
56
 
23
-
24
-
25
- *pos = *future;
26
- }
27
- /*-------------------------------------------------------------------------------------------------------------------------*/
28
-
29
-
30
57
  ```