Aabb
Трёхмерный бокс: координаты, размеры, включение точек и пересечение границ.
Ограничивающий бокс с гранями, параллельными осям координат. Position — начальная вершина, Size — полный размер, End = Position + Size. Это структура C#: присваивание копирует значение; Abs(), Grow(), Expand() и Merge() возвращают новый бокс.
Храните бокс и проверяемые точки в одной системе координат. Операция Transform3D * Aabb возвращает новый охватывающий Aabb; сам тип не хранит поворот. Для отрицательного Size сначала используйте Abs(). Для ненулевого объёма проверяйте HasVolume(), для конечности чисел — IsFinite().
Границы зависят от метода: HasPoint() включает End, Intersects() исключает простое касание обычных боксов, Intersection() сохраняет область контакта даже с нулевой толщиной. У IntersectsPlane() касание зависит от направления нормали — см. описание метода. Aabb не преобразуется в bool в C#; выбирайте явную проверку под свою задачу.
using Reckfell;
public static class BoundaryExamples
{
public static bool Validate()
{
var box = new Aabb(Vector3.Zero, new Vector3(2, 2, 2));
var neighbor = new Aabb(new Vector3(2, 0, 0), new Vector3(2, 2, 2));
bool includesEnd = box.HasPoint(box.End); // true
bool overlapsNeighbor = box.Intersects(neighbor); // false
Aabb contact = box.Intersection(neighbor); // position (2,0,0), size (0,2,2)
bool contactHasVolume = contact.HasVolume(); // false
Aabb padded = box.Grow(1); // position (-1,-1,-1), size (4,4,4)
return includesEnd && !overlapsNeighbor && !contactHasVolume
&& contact.Position == new Vector3(2, 0, 0)
&& contact.Size == new Vector3(0, 2, 2)
&& padded.Size == new Vector3(4, 4, 4)
&& box.Size == new Vector3(2, 2, 2); // original unchanged
}
}Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы4
Aabb4 перегрузки
public Aabb(Vector3 position, Vector3 size);Создаёт Aabb из начальной вершины и полного размера. Координаты и размеры сохраняются напрямую; отрицательные компоненты не исправляются. Для бокса нулевого размера в начале координат используйте default(Aabb).
| Имя | Тип | По умолчанию |
|---|---|---|
position | Vector3 | — |
size | Vector3 | — |
positionНачальная вершина бокса.
sizeПолный размер по трём осям; для обычных операций используйте неотрицательные компоненты.
public Aabb(Vector3 position, float width, float height, float depth);Создаёт Aabb из начальной вершины и полного размера. Координаты и размеры сохраняются напрямую; отрицательные компоненты не исправляются. Для бокса нулевого размера в начале координат используйте default(Aabb).
| Имя | Тип | По умолчанию |
|---|---|---|
position | Vector3 | — |
width | float | — |
height | float | — |
depth | float | — |
positionНачальная вершина бокса.
widthПолный размер по X, не полуразмер.
heightПолный размер по Y, не полуразмер.
depthПолный размер по Z, не полуразмер.
public Aabb(float x, float y, float z, Vector3 size);Создаёт Aabb из начальной вершины и полного размера. Координаты и размеры сохраняются напрямую; отрицательные компоненты не исправляются. Для бокса нулевого размера в начале координат используйте default(Aabb).
| Имя | Тип | По умолчанию |
|---|---|---|
x | float | — |
y | float | — |
z | float | — |
size | Vector3 | — |
xX начальной вершины.
yY начальной вершины.
zZ начальной вершины.
sizeПолный размер по трём осям; для обычных операций используйте неотрицательные компоненты.
public Aabb(float x, float y, float z, float width, float height, float depth);Создаёт Aabb из начальной вершины и полного размера. Координаты и размеры сохраняются напрямую; отрицательные компоненты не исправляются. Для бокса нулевого размера в начале координат используйте default(Aabb).
| Имя | Тип | По умолчанию |
|---|---|---|
x | float | — |
y | float | — |
z | float | — |
width | float | — |
height | float | — |
depth | float | — |
xX начальной вершины.
yY начальной вершины.
zZ начальной вершины.
widthПолный размер по X, не полуразмер.
heightПолный размер по Y, не полуразмер.
depthПолный размер по Z, не полуразмер.
Свойства4
EndСвойство
public Vector3 End { get; set; }Конечная вершина: Position + Size. Присваивание меняет только Size на value - Position; Position остаётся прежней. Значение меньше Position может создать отрицательный размер.
PositionСвойство
public Vector3 Position { get; set; }Начальная вершина бокса. Присваивание сохраняет Size и переносит End на ту же величину. Это координаты выбранной системы отсчёта, не автоматически мировая позиция объекта.
SizeСвойство
public Vector3 Size { get; set; }Полный размер по осям, а не полуразмеры: End = Position + Size. Присваивание не меняет Position и не нормализует отрицательные компоненты. Перед методами границ с отрицательным Size используйте Abs().
VolumeСвойство
public float Volume { get; }Вычисляет Size.X * Size.Y * Size.Z без нормализации и проверки знаков. Результат может быть отрицательным; две отрицательные компоненты дают положительное произведение. Для проверки положительных размеров используйте HasVolume().
Методы30
AbsAabb
public Aabb Abs();Возвращает эквивалентный бокс с неотрицательным Size: Position становится покомпонентным минимумом прежних Position и End. Нулевой размер остаётся нулевым. Исходное значение не меняется.
AabbНормализованная копия бокса.
Enclosesbool
public bool Encloses(Aabb with);Проверяет полное включение with по всем трём осям. Границы включены: бокс включает самого себя и меньший бокс, касающийся его граней. Предполагается неотрицательный Size у обоих боксов.
| Имя | Тип | По умолчанию |
|---|---|---|
with | Aabb | — |
withБокс в той же системе координат; при отрицательном Size сначала вызовите Abs().
booltrue, если Position и End другого бокса находятся внутри включённых границ этого бокса.
Equals2 перегрузки
public bool Equals(Aabb other);Сравнивает все компоненты Position и Size точно, без допуска и нормализации. Боксы с одинаковым геометрическим объёмом, но разными Position/Size, не равны. +0 и -0 сравниваются равными; NaN-компонента делает сравнение с копией false.
| Имя | Тип | По умолчанию |
|---|---|---|
other | Aabb | — |
otherДругой Aabb для точного сравнения.
booltrue при точном равенстве обоих полей бокса.
public override bool Equals(object? obj);Если obj — упакованный Aabb, сравнивает все компоненты Position и Size точно, без допуска и нормализации. Боксы с одинаковым геометрическим объёмом, но разными Position/Size, не равны. +0 и -0 сравниваются равными; NaN-компонента делает сравнение с копией false. Для null и другого типа возвращает false.
| Имя | Тип | По умолчанию |
|---|---|---|
obj | object | — |
objОбъект для сравнения; допускается null.
booltrue при точном равенстве обоих полей бокса.
ExpandAabb
public Aabb Expand(Vector3 point);Возвращает минимальную копию бокса, включающую прежние границы и point. Точка внутри или на границе не изменяет результат. Чтобы сохранить расширение, присвойте результат переменной; исходный Aabb не меняется.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector3 | — |
pointТочка в системе координат бокса.
AabbРасширенный бокс.
GetCenterVector3
public Vector3 GetCenter();Вычисляет Position + Size * 0.5f. Возвращает координаты центра в той же системе координат; не применяет Transform3D объекта.
Vector3Середина между Position и End.
GetEndpointVector3
public Vector3 GetEndpoint(int idx);Возвращает одну из восьми вершин. Бит 0 индекса выбирает End.Z, бит 1 — End.Y, бит 2 — End.X; при сброшенном бите используется Position соответствующей оси. Индекс 0 возвращает Position, индекс 7 — End. В C# индекс вне 0..7 вызывает ArgumentOutOfRangeException.
| Имя | Тип | По умолчанию |
|---|---|---|
idx | int | — |
idxИндекс вершины от 0 до 7 включительно.
Vector3Координаты вершины в системе координат бокса.
GetHashCodeint
public override int GetHashCode();Возвращает HashCode.Combine(Position, Size) для хеш-коллекций C#. Точно равные боксы имеют одинаковый хеш, но совпадение хеша не доказывает равенство. Dictionary<Aabb, T> использует точный Equals(), а не IsEqualApprox(). Не сохраняйте этот хеш как идентификатор ресурса или стабильную контрольную сумму между запусками.
intХеш-код текущих Position и Size.
GetLongestAxisVector3
public Vector3 GetLongestAxis();Возвращает положительный единичный вектор оси с большей компонентой Size: (1, 0, 0), (0, 1, 0) или (0, 0, 1). При равенстве приоритет X, затем Y, затем Z. Выбор основан на исходных знаковых значениях, не на модулях; для отрицательных размеров сначала используйте Abs(). Это ось бокса, не направление с учётом поворота объекта.
Vector3Положительный единичный вектор выбранной оси.
GetLongestAxisIndexVector3.Axis
public Vector3.Axis GetLongestAxisIndex();Выбирает наибольшую компоненту Size и возвращает соответствующий Vector3.Axis. При равенстве приоритет X, затем Y, затем Z. Сравнивает исходные знаковые значения, не модули; отрицательные размеры сначала нормализуйте через Abs().
Vector3.AxisVector3.Axis.X, Vector3.Axis.Y или Vector3.Axis.Z.
GetLongestAxisSizefloat
public float GetLongestAxisSize();Возвращает наибольшую компоненту Size без изменения знака. Это полный размер по выбранной оси, не полуразмер и не длина диагонали. Transform3D объекта не применяется.
floatМаксимум из Size.X, Size.Y и Size.Z.
GetShortestAxisVector3
public Vector3 GetShortestAxis();Возвращает положительный единичный вектор оси с меньшей компонентой Size: (1, 0, 0), (0, 1, 0) или (0, 0, 1). При равенстве приоритет X, затем Y, затем Z. Выбор основан на исходных знаковых значениях, не на модулях; для отрицательных размеров сначала используйте Abs(). Это ось бокса, не направление с учётом поворота объекта.
Vector3Положительный единичный вектор выбранной оси.
GetShortestAxisIndexVector3.Axis
public Vector3.Axis GetShortestAxisIndex();Выбирает наименьшую компоненту Size и возвращает соответствующий Vector3.Axis. При равенстве приоритет X, затем Y, затем Z. Сравнивает исходные знаковые значения, не модули; отрицательные размеры сначала нормализуйте через Abs().
Vector3.AxisVector3.Axis.X, Vector3.Axis.Y или Vector3.Axis.Z.
GetShortestAxisSizefloat
public float GetShortestAxisSize();Возвращает наименьшую компоненту Size без изменения знака. Это полный размер по выбранной оси, не полуразмер и не длина диагонали. Transform3D объекта не применяется.
floatМинимум из Size.X, Size.Y и Size.Z.
GetSupportVector3
public Vector3 GetSupport(Vector3 dir);Выбирает вершину, наиболее удалённую в направлении dir, для бокса с неотрицательным Size. Для положительной компоненты dir берёт соответствующую компоненту End, иначе — Position. Нормализация направления не нужна. При нулевой компоненте несколько вершин равноценны; dir == Vector3.Zero возвращает Position.
| Имя | Тип | По умолчанию |
|---|---|---|
dir | Vector3 | — |
dirНаправление в системе координат бокса; длина не влияет на выбор при неизменных знаках.
Vector3Координаты выбранной вершины.
GrowAabb
public Aabb Grow(float by);Возвращает копию с Position - Vector3.One * by и Size + Vector3.One * (2 * by). Отрицательное by уменьшает бокс. Ограничения снизу нет: чрезмерное уменьшение создаёт отрицательный Size; метод не зажимает его до нуля.
| Имя | Тип | По умолчанию |
|---|---|---|
by | float | — |
byОтступ с каждой из шести сторон в единицах координат бокса; не полный прирост размера.
AabbНовый бокс; исходный не меняется.
HasPointbool
public bool HasPoint(Vector3 point);Для конечных координат: Проверяет Position <= point <= End по каждой оси. Все шесть граней, рёбра и вершины включены, в том числе End. Для отрицательного Size сначала используйте Abs(). Это проверка координат бокса, а не попадания в геометрию меша. Метод не отбрасывает NaN автоматически и может вернуть true для такой точки. Проверяйте IsFinite() у прямоугольника или бокса и у входной точки отдельно.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector3 | — |
pointТочка в той же системе координат, что Position и Size.
booltrue, если точка внутри бокса или на его границе.
HasSurfacebool
public bool HasSurface();Возвращает true, если хотя бы одна компонента Size больше нуля. Несмотря на название, отрезок с Size = (2, 0, 0) тоже даёт true. Метод не вычисляет площадь поверхности и не проверяет корректность остальных компонент.
boolSize.X > 0 || Size.Y > 0 || Size.Z > 0.
HasVolumebool
public bool HasVolume();Возвращает true, только если все три компоненты Size положительны. Плоский бокс, отрезок и точка дают false. Используйте эту проверку вместо Volume > 0: произведение двух отрицательных размеров тоже может быть положительным.
boolSize.X > 0 && Size.Y > 0 && Size.Z > 0.
IntersectionAabb
public Aabb Intersection(Aabb with);Вычисляет общий бокс для двух боксов с неотрицательным Size. Касание сохраняется: общая грань даёт одну нулевую компоненту Size, общее ребро — две, вершина — три. При раздельных боксах возвращает default(Aabb), то есть нулевой бокс в начале координат. Поэтому один результат default не позволяет отличить отсутствие пересечения от контакта в начале координат.
| Имя | Тип | По умолчанию |
|---|---|---|
with | Aabb | — |
withДругой бокс в той же системе координат с неотрицательным Size.
AabbОбщая область, включая вырожденный контакт, либо default(Aabb) при отсутствии общей области.
Intersectsbool
public bool Intersects(Aabb with);Сравнивает интервалы по трём осям строгими неравенствами. Для обычных боксов с положительным Size касание только гранью, ребром или вершиной даёт false. Метод не проверяет HasVolume(): вырожденный бокс внутри другого может дать true. Для требования ненулевого объёма у обоих боксов отдельно проверьте HasVolume().
| Имя | Тип | По умолчанию |
|---|---|---|
with | Aabb | — |
withДругой бокс в той же системе координат. Перед проверкой нормализуйте отрицательный Size через Abs().
booltrue, если ни по одной оси не выполнено разделение или равенство противоположных границ.
IntersectsPlanebool
public bool IntersectsPlane(Plane plane);Проверяет расстояния восьми вершин до plane. Возвращает true, если есть хотя бы одна вершина с DistanceTo > 0 и хотя бы одна с DistanceTo <= 0. При строгом пересечении это обычный тест плоскости и бокса. При одном касании результат зависит от направления нормали: нулевое расстояние относится только к неположительной стороне. Не используйте метод как симметричную проверку касания с допуском.
| Имя | Тип | По умолчанию |
|---|---|---|
plane | Plane | — |
planeПлоскость в системе координат бокса. Метод не добавляет допуск к DistanceTo.
booltrue при наличии вершин в обеих указанных группах расстояний.
IntersectsSegmentbool
public bool IntersectsSegment(Vector3 from, Vector3 to);Проверяет конечный отрезок от from до to, включая оба конца и границу бокса. Касание грани считается пересечением. Если from == to, результат соответствует включению этой точки в бокс. Предполагается неотрицательный Size. Метод возвращает только bool, без точки попадания, нормали или расстояния.
| Имя | Тип | По умолчанию |
|---|---|---|
from | Vector3 | — |
to | Vector3 | — |
fromНачальная точка отрезка в системе координат бокса.
toКонечная точка отрезка, а не вектор направления.
booltrue, если хотя бы одна точка конечного отрезка принадлежит боксу.
IsEqualApproxbool
public bool IsEqualApprox(Aabb other);Покомпонентно сравнивает Position и Size через Mathf.IsEqualApprox(). В текущей float-SDK точное равенство принимается сразу; иначе требуется abs(a - b) < max(0.000001, 0.000001 * abs(a)), где a — компонента этого бокса. Допуск не задаётся параметром и растёт с величиной первого значения. На границе допуска порядок операндов может менять результат; проверка также не транзитивна. Не используйте её как равенство ключей Dictionary или вместо проверки конечности: одинаковые бесконечности проходят точное сравнение, NaN — нет.
| Имя | Тип | По умолчанию |
|---|---|---|
other | Aabb | — |
otherБокс для сравнения; его компоненты являются вторыми операндами проверки допуска.
booltrue, если все шесть сравнений компонентов проходят.
IsFinitebool
public bool IsFinite();Проверяет все шесть компонент Position и Size на NaN и бесконечность. Отрицательный или нулевой размер сам по себе даёт true: это проверка конечности чисел, а не пригодности бокса для конкретного алгоритма.
booltrue, если все компоненты Position и Size конечны.
MergeAabb
public Aabb Merge(Aabb with);Возвращает минимальный Aabb, включающий оба исходных бокса. Это охватывающий прямоугольный объём: свободное пространство между раздельными боксами тоже входит в результат. Оба бокса должны находиться в одной системе координат и иметь неотрицательный Size. Исходные значения не меняются.
| Имя | Тип | По умолчанию |
|---|---|---|
with | Aabb | — |
withБокс, границы которого нужно включить.
AabbНовый охватывающий бокс.
ToString2 перегрузки
public override string ToString();Формирует строку Position.ToString(format) + ", " + Size.ToString(format): например, (1.25, -2.5, 3), (1, 1, 1). Координаты используют InvariantCulture: десятичная точка не зависит от языка системы. Это диагностическая строка, не формат JSON или сохранения игры. Эквивалентен ToString(null).
stringСтрока с координатами Position и Size.
public string ToString(string? format);Формирует строку Position.ToString(format) + ", " + Size.ToString(format): например, (1.25, -2.5, 3), (1, 1, 1). Координаты используют InvariantCulture: десятичная точка не зависит от языка системы. Это диагностическая строка, не формат JSON или сохранения игры. Формат применяется ко всем шести числам; F2 округляет вывод до двух знаков, не изменяя бокс. Неподдерживаемый числовой формат может вызвать FormatException.
| Имя | Тип | По умолчанию |
|---|---|---|
format | string | — |
formatЧисловой формат .NET, например "F2". null выбирает формат по умолчанию.
stringСтрока с координатами Position и Size.
op_Equalitybool
public static bool operator ==(Aabb left, Aabb right);Точное сравнение Equals(right). Сравнивает компоненты Position и Size, без допуска, Abs() или проверки перекрытия. +0 и -0 равны. При NaN в компоненте равенство с копией false, а неравенство true.
| Имя | Тип | По умолчанию |
|---|---|---|
left | Aabb | — |
right | Aabb | — |
leftЛевый бокс.
rightПравый бокс.
booltrue при точном равенстве.
op_Inequalitybool
public static bool operator !=(Aabb left, Aabb right);Отрицание точного сравнения Equals(right). Сравнивает компоненты Position и Size, без допуска, Abs() или проверки перекрытия. +0 и -0 равны. При NaN в компоненте равенство с копией false, а неравенство true.
| Имя | Тип | По умолчанию |
|---|---|---|
left | Aabb | — |
right | Aabb | — |
leftЛевый бокс.
rightПравый бокс.
booltrue при неравенстве.