1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #pragma once19 20 #include <stdio.h>21 22 #include "../Math/float2.h"23 #include "../Math/float3.h"24 #include "../Math/MathConstants.h"25 26 [MATH_BEGIN_NAMESPACE]27 28 struct [AABB2D]29 {30 [AABB2D]() { }31 [AABB2D](const [float2] &minPt, const [float2] &maxPt)32 :[minPoint](minPt),33 [maxPoint](maxPt)34 {35 }36 37 [float2] [minPoint];38 [float2] [maxPoint];39 40 float [Width]() const { return [maxPoint].[x] - [minPoint].[x]; }41 float [Height]() const { return [maxPoint].[y] - [minPoint].[y]; }42 43 float [DistanceSq](const [float2] &pt) const44 {45 [float2] cp = pt.[Clamp]([minPoint], [maxPoint]);46 return cp.[DistanceSq](pt);47 }48 49 void [SetNegativeInfinity]()50 {51 [minPoint].[SetFromScalar]([FLOAT_INF]);52 [maxPoint].[SetFromScalar](-[FLOAT_INF]);53 }54 55 void [Enclose](const [float2] &point)56 {57 [minPoint] = [Min]([minPoint], point);58 [maxPoint] = [Max]([maxPoint], point);59 }60 61 bool [Intersects](const [AABB2D] &rhs) const62 {63 return [maxPoint].[x] >= rhs.[minPoint].[x] &&64 [maxPoint].[y] >= rhs.[minPoint].[y] &&65 rhs.[maxPoint].[x] >= [minPoint].[x] &&66 rhs.[maxPoint].[y] >= [minPoint].[y];67 }68 69 bool [Contains](const [AABB2D] &rhs) const70 {71 return rhs.[minPoint].[x] >= [minPoint].[x] && rhs.[minPoint].[y] >= [minPoint].[y]72 && rhs.[maxPoint].[x] <= [maxPoint].[x] && rhs.[maxPoint].[y] <= [maxPoint].[y];73 }74 75 bool [Contains](const [float2] &pt) const76 {77 return pt.[x] >= [minPoint].[x] && pt.[y] >= [minPoint].[y]78 && pt.[x] <= [maxPoint].[x] && pt.[y] <= [maxPoint].[y];79 }80 81 bool [Contains](int x, int y) const82 {83 return x >= [minPoint].[x] && y >= [minPoint].[y]84 && x <= [maxPoint].[x] && y <= [maxPoint].[y];85 }86 87 bool [IsDegenerate]() const88 {89 return [minPoint].[x] >= [maxPoint].[x] || [minPoint].[y] >= [maxPoint].[y];90 }91 92 bool [HasNegativeVolume]() const93 {94 return [maxPoint].[x] < [minPoint].[x] || [maxPoint].[y] < [minPoint].[y];95 }96 97 bool [IsFinite]() const98 {99 return [minPoint].[IsFinite]() && [maxPoint].[IsFinite]() && [minPoint].[MinElement]() > -1e5f && [maxPoint].[MaxElement]() < 1e5f;100 }101 102 [float2] [PosInside](const [float2] &normalizedPos) const103 {104 return [minPoint] + normalizedPos.[Mul]([maxPoint] - [minPoint]);105 }106 107 [float2] [ToNormalizedLocalSpace](const [float2] &pt) const108 {109 return (pt - [minPoint]).[Div]([maxPoint] - [minPoint]);110 }111 112 [AABB2D] [operator +](const [float2] &pt) const113 {114 [AABB2D] a;115 a.[minPoint] = [minPoint] + pt;116 a.[maxPoint] = [maxPoint] + pt;117 return a;118 }119 120 [AABB2D] [operator -](const [float2] &pt) const121 {122 [AABB2D] a;123 a.[minPoint] = [minPoint] - pt;124 a.[maxPoint] = [maxPoint] - pt;125 return a;126 }127 128 #ifdef MATH_ENABLE_STL_SUPPORT129 std::string [ToString]() const130 {131 char str[256];132 sprintf(str, "AABB2D(Min:(%.2f, %.2f) Max:(%.2f, %.2f))", [minPoint].[x], [minPoint].[y], [maxPoint].[x], [maxPoint].[y]);133 return str;134 }135 #endif136 };137 138 inline [AABB2D] [GetAABB2D](const [float3] &pt) { return [AABB2D](pt.[xy](), pt.[xy]()); }139 140 inline bool [Contains](const [AABB2D] &aabb, const [float3] &pt)141 {142 return aabb.[minPoint].[x] <= pt.[x] &&143 aabb.[minPoint].[y] <= pt.[y] &&144 pt.[x] <= aabb.[maxPoint].[x] &&145 pt.[y] <= aabb.[maxPoint].[y];146 }147 148 [MATH_END_NAMESPACE] Go back to previous page