This commit is contained in:
aozhiwei 2022-08-05 10:05:50 +08:00
parent 27ecd5c940
commit cc57f69109
2 changed files with 99 additions and 0 deletions

View File

@ -85,6 +85,104 @@ namespace a8
return u1 > 0.000001f && u2 > 0.000001; return u1 > 0.000001f && u2 > 0.000001;
} }
bool IntersectAabbObb(a8::Vec2 a_min, a8::Vec2 a_max, a8::Vec2 b_pos, float rotate)
{
struct Segment
{
a8::Vec2 point1;
a8::Vec2 point2;
a8::Vec2 dir;
};
std::vector<Segment> a_edges;
std::vector<Segment> b_edges;
for (int i = 0; i < 3; ++i) {
Segment seg;
switch (i) {
case 0:
{
seg.point1 = a_min;
seg.point2 = a_min + a8::Vec2(a_max.x - a_min.x, 0);
seg.dir = seg.point2 - seg.point1;
}
break;
case 1:
{
seg.point1 = a_min + a8::Vec2(a_max.x - a_min.x, 0);
seg.point2 = a_max;
seg.dir = seg.point2 - seg.point1;
}
break;
case 2:
{
seg.point1 = a_max;
seg.point2 = a_min + a8::Vec2(0, a_max.y - a_min.y);
seg.dir = seg.point2 - seg.point1;
}
break;
case 3:
{
seg.point1 = a_min + a8::Vec2(0, a_max.y - a_min.y);
seg.point2 = a_min;
seg.dir = seg.point2 - seg.point1;
}
break;
default:
{
abort();
}
}
a_edges.push_back(seg);
}
for (int i = 0; i < 3; ++i) {
Segment seg;
switch (i) {
case 0:
{
seg.point1 = a_min;
seg.point2 = a_min + a8::Vec2(a_max.x - a_min.x, 0);
seg.dir = seg.point2 - seg.point1;
}
break;
case 1:
{
seg.point1 = a_min + a8::Vec2(a_max.x - a_min.x, 0);
seg.point2 = a_max;
seg.dir = seg.point2 - seg.point1;
}
break;
case 2:
{
seg.point1 = a_max;
seg.point2 = a_min + a8::Vec2(0, a_max.y - a_min.y);
seg.dir = seg.point2 - seg.point1;
}
break;
case 3:
{
seg.point1 = a_min + a8::Vec2(0, a_max.y - a_min.y);
seg.point2 = a_min;
seg.dir = seg.point2 - seg.point1;
}
break;
default:
{
abort();
}
}
b_edges.push_back(seg);
}
auto GetProjectionWithAxis =
[] (std::vector<a8::Vec2> vertices, a8::Vec2 axis) -> a8::Vec2 {
axis.Normalize();
float _min = vertices[0].Dot(axis);
float _max = _min;
for (a8::Vec2& v : vertices) {
}
};
return false;
}
bool IntersectCircleCircle(a8::Vec2 a_pos, float a_rad, a8::Vec2 b_pos, float b_rad) bool IntersectCircleCircle(a8::Vec2 a_pos, float a_rad, a8::Vec2 b_pos, float b_rad)
{ {
float t = a_rad + b_rad; float t = a_rad + b_rad;

View File

@ -9,6 +9,7 @@ namespace a8
bool IntersectSegmentAabb(a8::Vec2 p0, a8::Vec2 p1, a8::Vec2 _min, a8::Vec2 _max); bool IntersectSegmentAabb(a8::Vec2 p0, a8::Vec2 p1, a8::Vec2 _min, a8::Vec2 _max);
bool IntersectAabbCircle(a8::Vec2 a_min, a8::Vec2 a_max, a8::Vec2 b_pos, float b_rad); bool IntersectAabbCircle(a8::Vec2 a_min, a8::Vec2 a_max, a8::Vec2 b_pos, float b_rad);
bool IntersectAabbAabb(a8::Vec2 a_min, a8::Vec2 a_max, a8::Vec2 b_min, a8::Vec2 b_max); bool IntersectAabbAabb(a8::Vec2 a_min, a8::Vec2 a_max, a8::Vec2 b_min, a8::Vec2 b_max);
bool IntersectAabbObb(a8::Vec2 a_min, a8::Vec2 a_max, a8::Vec2 b_pos, float rotate);
bool IntersectCircleCircle(a8::Vec2 a_pos, float a_rad, a8::Vec2 b_pos, float b_rad); bool IntersectCircleCircle(a8::Vec2 a_pos, float a_rad, a8::Vec2 b_pos, float b_rad);
bool IntersectSectorCircle(a8::Vec2 a_pos, float angle, float a_rad, a8::Vec2 b_pos, float b_rad); bool IntersectSectorCircle(a8::Vec2 a_pos, float angle, float a_rad, a8::Vec2 b_pos, float b_rad);
bool IntersectSectorAabb(a8::Vec2 a_pos, float angle, float a_rad, a8::Vec2 b_min, a8::Vec2 b_max); bool IntersectSectorAabb(a8::Vec2 a_pos, float angle, float a_rad, a8::Vec2 b_min, a8::Vec2 b_max);