提示画像ですが。少しでも上下にずれるとfalse 当たっていない。と表示されます。これはエッジケースなのでしょうか?
ブロックは四角ですが円の当たり判定です。プレイヤーは正方形の上の線を線分として定義しています。
cpp
1 2/*################################################### 3* 円と矩形の当たり判定 4*####################################################*/ 5 6 7//2つが異なっているかどうか? 8int acute_obtuse_diff(const float a, const float b) 9{ 10 if (a == 0) 11 { 12 if (b != 0) 13 { 14 return true; 15 } 16 else 17 { 18 return false; 19 } 20 21 } 22 else if (a > 0) 23 { 24 if (b <= 0) 25 { 26 return true; 27 } 28 else { 29 return false; 30 } 31 } 32 else if (a < 0) 33 { 34 if (a >= 0) 35 { 36 return true; 37 } 38 else 39 { 40 return false; 41 } 42 } 43} 44 45// 線分と円の当たり判定 46bool Line_Circle_col(const Line LineAB, const glm::vec2 Cpos, const float R) 47{ 48 49 glm::vec2 n = LineAB.end - LineAB.start; //A 50 n = glm::normalize(n); //Aを正規化 51 glm::vec2 Bvec = Cpos - LineAB.start; //B 52 53 float b = n.x * Bvec.y - Bvec.x * n.y; //最短距離 54// printf("b: %f\n",b); 55 56 57 if (b < R) 58 { 59 60 glm::vec2 AA1 = LineAB.end - LineAB.start; 61 glm::vec2 BB1 = Cpos - LineAB.start; 62 63 glm::vec2 AA2 = Cpos - LineAB.end; 64 glm::vec2 BB2 = LineAB.end - LineAB.start; 65 66 67 float AA = glm::dot(AA1, BB1); //内積 68 float BB = glm::dot(AA2, BB2); //内積 69 70 printf("AA %f\n",AA); 71 printf("BB %f\n",BB); 72 73 74 75 //2つが異なるかどうか? 76 if (acute_obtuse_diff(AA,BB) == true) 77 { 78 printf("A \n"); 79 return true; 80 } 81 else 82 { 83 printf("B\n"); 84 glm::vec2 SS = Cpos - LineAB.start; 85 glm::vec2 DD = Cpos - LineAB.end; 86 87 88 89 90 //printf("SS: %d\n",SS.length()); 91 // printf("DD: %d\n",DD.length()); 92 93 if ( (SS.length() < R) || (DD.length() < R) ) 94 { 95 printf("2\n"); 96 97 return true; 98 } 99 else { 100 false; 101 } 102 } 103 } 104 else { 105 printf("C\n"); 106 return false; 107 } 108} 109 110 111bool Intersect_2D(Box_Collision_2D& a, Circle_Collision_2D& circle) 112{ 113 // 線分 114 Line Line_up = Line{ glm::vec2(0,0),glm::vec2(0,0) }; 115 Line Line_down = Line{ glm::vec2(0,0),glm::vec2(0,0) }; 116 Line Line_left = Line{ glm::vec2(0,0),glm::vec2(0,0) }; 117 Line Line_right = Line{glm::vec2(0,0),glm::vec2(0,0) }; 118 119 glm::vec2 Cpos = circle.getPosition(); //円の座標 120 float R = circle.getSize(); //半径 121 //printf("R: %f\n",R); 122 123 glm::ivec2 pos; 124 glm::ivec2 pos2; 125 126 // up 127 Line_up.start = a.getPosition(); 128 129 pos = a.getPosition(); 130 pos.x += a.getSize().x; 131 Line_up.end = pos; 132 133 // down 134 pos = a.getPosition(); 135 pos.y += a.getSize().y; 136 Line_down.start = pos; 137 138 pos = a.getPosition(); 139 pos.x += a.getSize().x; 140 pos.y += a.getSize().y; 141 Line_down.end = pos; 142 143 // left 144 pos = a.getPosition(); 145 Line_left.start = pos; 146 147 pos = a.getPosition(); 148 pos.y += a.getSize().y; 149 Line_left.end = pos; 150 151 // right 152 pos = a.getPosition(); 153 pos.x += a.getSize().x; 154 Line_right.start = pos; 155 156 pos = a.getPosition(); 157 pos.y += a.getSize().y; 158 pos.x += a.getSize().x; 159 Line_right.end = pos; 160 161 ////////////////////////////////////// 162 163 if (Line_Circle_col(Line_up,Cpos,R) == true) 164 { 165 //printf("UP \n"); 166 return true; 167 } 168 else { 169 return false; 170 } 171 172 return false; 173}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/02/02 02:04 編集
2021/02/02 03:36
退会済みユーザー
2021/02/02 03:37
2021/02/02 03:54
退会済みユーザー
2021/02/02 04:07
2021/02/02 04:11
退会済みユーザー
2021/02/02 04:16
2021/02/02 04:21
退会済みユーザー
2021/02/02 04:22
2021/02/02 05:04
2021/02/02 05:28
2021/02/02 05:45 編集
退会済みユーザー
2021/02/02 06:02
2021/02/02 08:37
退会済みユーザー
2021/02/02 09:22