Geometry2D
Аналитическая 2D-геометрия, операции над контурами и упаковка прямоугольников.
Статические CPU-операции над переданными точками. Не запрашивают физический мир, не учитывают collision layers и не создают CollisionPolygon2D/текстуру автоматически. Все входы должны быть в одной системе координат. Singleton заимствован: не вызывайте Free/Dispose.
LineIntersectsLine принимает точку и направление каждой бесконечной прямой; SegmentIntersectsSegment — концы двух отрезков. Результат Variant содержит Vector2 либо Nil, включая отдельный случай коллинеарного перекрытия: единственная точка для него не возвращается. SegmentIntersectsCircle вместо точки даёт долю t в 0…1 или -1 при промахе. В отличие от соответствующего 3D-метода, 2D-вариант принимает точное касание и может вернуть выход при старте внутри.
float t = Geometry2D.SegmentIntersectsCircle(
new Vector2(-2, 0), new Vector2(2, 0), Vector2.Zero, 1);
if (t >= 0)
{
Vector2 hit = new Vector2(-2, 0).Lerp(new Vector2(2, 0), t);
}Boolean-операции возвращают Array<Vector2[]> контуров: Merge — объединение, Clip — A минус B, Intersect — общая область, Exclude — XOR. Один результат может содержать несколько внешних контуров и отверстия. Не заполняйте каждый контур как независимый сплошной полигон: этим вы закроете отверстия. Порядок/начальная вершина не являются стабильными ID. Операции используют EvenOdd и внутреннюю дискретизацию с точностью 5 десятичных знаков, а не точную арифметику произвольного масштаба.
IsPolygonClockwise использует декартову систему Y вверх; визуальное направление на экране Y вниз противоположно. IsPointInPolygon принимает граничные точки с допуском, но PointIsInsideTriangle не даёт такого универсального контракта: результат для ребра меняется при обратном обходе. Не используйте его как валидатор вырожденного треугольника.
OffsetPolygon расширяет/сжимает замкнутую область. OffsetPolyline строит обводку толщиной примерно 2*abs(delta): в текущей Clipper2 отрицательная delta для открытого пути берётся по модулю. Это не сжатие линии и не обещание пустого результата. Array-overload имеют значения join/end по умолчанию, span-overload требуют их явно.
ConvexHull возвращает замыкающий повтор первой вершины; при передаче в TriangulatePolygon уберите повтор и проверьте простой контур. TriangulatePolygon работает с границей одного полигона; TriangulateDelaunay — с облаком точек и не сохраняет вогнутую границу/отверстия. MakeAtlas возвращает размещение прямоугольников, не изображение; проверяйте размеры до вызова, в частности не передавайте ширину свыше 4096 в текущий алгоритм.
38 Windows headless-проверок покрыли простые пересечения, границы, boolean-площади/отверстие, обводки, триангуляцию и небольшой атлас. Произвольная топология, extreme-scale точность, большие атласы, физический мир, производительность и рендер не проверены.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Свойства1
SingletonСвойство
public static Geometry2DInstance Singleton { get; }Заимствованный Geometry2DInstance статических операций. Не освобождайте вручную и не создавайте второй экземпляр сервиса.
Методы39
BresenhamLineReckfell.Collections.Array<Vector2I>
public static Reckfell.Collections.Array<Vector2I> BresenhamLine(Vector2I from, Vector2I to);Возвращает целочисленные ячейки линии Брезенхэма, включая оба конца. Для совпадающих концов одна точка. Не supercover-растеризация всех затронутых ячеек и не физический raycast; длина результата растёт с расстоянием.
| Имя | Тип | По умолчанию |
|---|---|---|
from | Vector2I | — |
to | Vector2I | — |
fromЦелочисленный конец линии Брезенхэма; оба конца включены.
toЦелочисленный конец линии Брезенхэма; оба конца включены.
Reckfell.Collections.Array<Vector2I>Array<Vector2I> упорядоченных ячеек от from до to включительно.
ClipPolygons2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> ClipPolygons(Vector2[] polygonA, Vector2[] polygonB);Разность A−B: удаляет из A область B. Не XOR и не пересечение. Вложенный B может создать отдельный контур отверстия; его нельзя заполнять как независимый solid.
| Имя | Тип | По умолчанию |
|---|---|---|
polygonA | Vector2[] | — |
polygonB | Vector2[] | — |
polygonAУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
polygonBУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
public static Reckfell.Collections.Array<Vector2[]> ClipPolygons(ReadOnlySpan<Vector2> polygonA, ReadOnlySpan<Vector2> polygonB);Разность A−B: удаляет из A область B. Не XOR и не пересечение. Вложенный B может создать отдельный контур отверстия; его нельзя заполнять как независимый solid.
| Имя | Тип | По умолчанию |
|---|---|---|
polygonA | ReadOnlySpan<Vector2> | — |
polygonB | ReadOnlySpan<Vector2> | — |
polygonAУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
polygonBУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
ClipPolylineWithPolygon2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> ClipPolylineWithPolygon(Vector2[] polyline, Vector2[] polygon);Оставляет части открытой polyline вне polygon. Линия может разбиться на несколько открытых фрагментов; они не являются заполненными полигонами.
| Имя | Тип | По умолчанию |
|---|---|---|
polyline | Vector2[] | — |
polygon | Vector2[] | — |
polylineУпорядоченные вершины открытой линии, обычно минимум две различные точки.
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> открытых фрагментов, возможно пустой.
public static Reckfell.Collections.Array<Vector2[]> ClipPolylineWithPolygon(ReadOnlySpan<Vector2> polyline, ReadOnlySpan<Vector2> polygon);Оставляет части открытой polyline вне polygon. Линия может разбиться на несколько открытых фрагментов; они не являются заполненными полигонами.
| Имя | Тип | По умолчанию |
|---|---|---|
polyline | ReadOnlySpan<Vector2> | — |
polygon | ReadOnlySpan<Vector2> | — |
polylineУпорядоченные вершины открытой линии, обычно минимум две различные точки.
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> открытых фрагментов, возможно пустой.
ConvexHull2 перегрузки
public static Vector2[] ConvexHull(Vector2[] points);Строит выпуклую оболочку облака, сортируя копию входа. Вывод идёт против часовой стрелки в Y вверх и повторяет первую вершину в конце для обычной невырожденной оболочки. Внутренние/лишние коллинеарные точки не обязаны сохраняться.
| Имя | Тип | По умолчанию |
|---|---|---|
points | Vector2[] | — |
pointsКонечное облако Vector2 в общей системе координат; для Delaunay нужны невырожденные неколлинеарные данные.
Vector2[]Vector2[] оболочки с замыкающим повтором первой вершины для обычного невырожденного входа.
public static Vector2[] ConvexHull(ReadOnlySpan<Vector2> points);Строит выпуклую оболочку облака, сортируя копию входа. Вывод идёт против часовой стрелки в Y вверх и повторяет первую вершину в конце для обычной невырожденной оболочки. Внутренние/лишние коллинеарные точки не обязаны сохраняться.
| Имя | Тип | По умолчанию |
|---|---|---|
points | ReadOnlySpan<Vector2> | — |
pointsКонечное облако Vector2 в общей системе координат; для Delaunay нужны невырожденные неколлинеарные данные.
Vector2[]Vector2[] оболочки с замыкающим повтором первой вершины для обычного невырожденного входа.
DecomposePolygonInConvex2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> DecomposePolygonInConvex(Vector2[] polygon);Разбивает простой вогнутый полигон на выпуклые контуры, не обязательно треугольники. Вход — один корректный контур; boolean-результат с отверстиями нельзя обрабатывать заполнением/разбиением каждого кольца независимо.
| Имя | Тип | По умолчанию |
|---|---|---|
polygon | Vector2[] | — |
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> выпуклых частей одного полигона; пустой результат возможен при неудаче. Отдельных колец отверстий этот вход не задаёт.
public static Reckfell.Collections.Array<Vector2[]> DecomposePolygonInConvex(ReadOnlySpan<Vector2> polygon);Разбивает простой вогнутый полигон на выпуклые контуры, не обязательно треугольники. Вход — один корректный контур; boolean-результат с отверстиями нельзя обрабатывать заполнением/разбиением каждого кольца независимо.
| Имя | Тип | По умолчанию |
|---|---|---|
polygon | ReadOnlySpan<Vector2> | — |
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> выпуклых частей одного полигона; пустой результат возможен при неудаче. Отдельных колец отверстий этот вход не задаёт.
ExcludePolygons2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> ExcludePolygons(Vector2[] polygonA, Vector2[] polygonB);Симметрическая разность XOR: оставляет заполненную ровно одним полигоном область. В отличие от ClipPolygons, учитывает также часть B вне A.
| Имя | Тип | По умолчанию |
|---|---|---|
polygonA | Vector2[] | — |
polygonB | Vector2[] | — |
polygonAУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
polygonBУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
public static Reckfell.Collections.Array<Vector2[]> ExcludePolygons(ReadOnlySpan<Vector2> polygonA, ReadOnlySpan<Vector2> polygonB);Симметрическая разность XOR: оставляет заполненную ровно одним полигоном область. В отличие от ClipPolygons, учитывает также часть B вне A.
| Имя | Тип | По умолчанию |
|---|---|---|
polygonA | ReadOnlySpan<Vector2> | — |
polygonB | ReadOnlySpan<Vector2> | — |
polygonAУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
polygonBУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
GetClosestPointToSegmentVector2
public static Vector2 GetClosestPointToSegment(Vector2 point, Vector2 s1, Vector2 s2);Проецирует point на конечный s1–s2, ограничивая концами. Для почти нулевого отрезка возвращает s1. Расстояние вычисляйте отдельно.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector2 | — |
s1 | Vector2 | — |
s2 | Vector2 | — |
pointПроверяемая точка в той же системе координат, что геометрия.
s1Точка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
s2Точка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
Vector2Спроецированный Vector2, не расстояние.
GetClosestPointToSegmentUncappedVector2
public static Vector2 GetClosestPointToSegmentUncapped(Vector2 point, Vector2 s1, Vector2 s2);Проецирует на бесконечную прямую через s1/s2, без ограничения концами. Почти совпадающие концы дают s1.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector2 | — |
s1 | Vector2 | — |
s2 | Vector2 | — |
pointПроверяемая точка в той же системе координат, что геометрия.
s1Точка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
s2Точка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
Vector2Спроецированный Vector2, не расстояние.
GetClosestPointsBetweenSegmentsVector2[]
public static Vector2[] GetClosestPointsBetweenSegments(Vector2 p1, Vector2 q1, Vector2 p2, Vector2 q2);Возвращает две ближайшие точки: первую на p1–q1, вторую на p2–q2. Здесь имена параметров отличаются от Geometry3D. Это не пара пересечений и не расстояние.
| Имя | Тип | По умолчанию |
|---|---|---|
p1 | Vector2 | — |
q1 | Vector2 | — |
p2 | Vector2 | — |
q2 | Vector2 | — |
p1Точка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
q1Точка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
p2Точка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
q2Точка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
Vector2[]Два Vector2: точка p1–q1, затем p2–q2.
IntersectPolygons2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> IntersectPolygons(Vector2[] polygonA, Vector2[] polygonB);Пересечение A∩B: оставляет только общую заполненную область. Без общей площади результат может быть пустым; это не поиск одной точки касания.
| Имя | Тип | По умолчанию |
|---|---|---|
polygonA | Vector2[] | — |
polygonB | Vector2[] | — |
polygonAУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
polygonBУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
public static Reckfell.Collections.Array<Vector2[]> IntersectPolygons(ReadOnlySpan<Vector2> polygonA, ReadOnlySpan<Vector2> polygonB);Пересечение A∩B: оставляет только общую заполненную область. Без общей площади результат может быть пустым; это не поиск одной точки касания.
| Имя | Тип | По умолчанию |
|---|---|---|
polygonA | ReadOnlySpan<Vector2> | — |
polygonB | ReadOnlySpan<Vector2> | — |
polygonAУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
polygonBУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
IntersectPolylineWithPolygon2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> IntersectPolylineWithPolygon(Vector2[] polyline, Vector2[] polygon);Оставляет части открытой polyline внутри polygon. Возвращает открытые фрагменты, не площадь и не автоматически замкнутые контуры.
| Имя | Тип | По умолчанию |
|---|---|---|
polyline | Vector2[] | — |
polygon | Vector2[] | — |
polylineУпорядоченные вершины открытой линии, обычно минимум две различные точки.
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> открытых фрагментов, возможно пустой.
public static Reckfell.Collections.Array<Vector2[]> IntersectPolylineWithPolygon(ReadOnlySpan<Vector2> polyline, ReadOnlySpan<Vector2> polygon);Оставляет части открытой polyline внутри polygon. Возвращает открытые фрагменты, не площадь и не автоматически замкнутые контуры.
| Имя | Тип | По умолчанию |
|---|---|---|
polyline | ReadOnlySpan<Vector2> | — |
polygon | ReadOnlySpan<Vector2> | — |
polylineУпорядоченные вершины открытой линии, обычно минимум две различные точки.
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> открытых фрагментов, возможно пустой.
IsPointInCirclebool
public static bool IsPointInCircle(Vector2 point, Vector2 circlePosition, float circleRadius);Проверяет квадрат расстояния ≤ radius²; граница включена. Используйте неотрицательный радиус: формула возводит его в квадрат, не проверяя смысл отрицательного значения.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector2 | — |
circlePosition | Vector2 | — |
circleRadius | float | — |
pointПроверяемая точка в той же системе координат, что геометрия.
circlePositionЦентр круга в общей системе координат.
circleRadiusНеотрицательный конечный радиус в единицах точек.
boolЛогический результат с граничными условиями, указанными в описании метода.
IsPointInPolygon2 перегрузки
public static bool IsPointInPolygon(Vector2 point, Vector2[] polygon);Проверяет точку в одном контуре лучевым методом; найденная на ребре точка включается с приближённым сравнением. Менее трёх вершин дают false. Несколько контуров с отверстиями не передаются как один неупорядоченный массив.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector2 | — |
polygon | Vector2[] | — |
pointПроверяемая точка в той же системе координат, что геометрия.
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
boolЛогический результат с граничными условиями, указанными в описании метода.
public static bool IsPointInPolygon(Vector2 point, ReadOnlySpan<Vector2> polygon);Проверяет точку в одном контуре лучевым методом; найденная на ребре точка включается с приближённым сравнением. Менее трёх вершин дают false. Несколько контуров с отверстиями не передаются как один неупорядоченный массив.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector2 | — |
polygon | ReadOnlySpan<Vector2> | — |
pointПроверяемая точка в той же системе координат, что геометрия.
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
boolЛогический результат с граничными условиями, указанными в описании метода.
IsPolygonClockwise2 перегрузки
public static bool IsPolygonClockwise(Vector2[] polygon);Проверяет обход замкнутого контура в декартовых координатах Y вверх. В экранных Y вниз визуальный смысл обратный. Менее трёх точек дают false, что не доказывает валидный противоположный обход.
| Имя | Тип | По умолчанию |
|---|---|---|
polygon | Vector2[] | — |
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
boolЛогический результат с граничными условиями, указанными в описании метода.
public static bool IsPolygonClockwise(ReadOnlySpan<Vector2> polygon);Проверяет обход замкнутого контура в декартовых координатах Y вверх. В экранных Y вниз визуальный смысл обратный. Менее трёх точек дают false, что не доказывает валидный противоположный обход.
| Имя | Тип | По умолчанию |
|---|---|---|
polygon | ReadOnlySpan<Vector2> | — |
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
boolЛогический результат с граничными условиями, указанными в описании метода.
LineIntersectsLineVariant
public static Variant LineIntersectsLine(Vector2 fromA, Vector2 dirA, Vector2 fromB, Vector2 dirB);Пересекает две бесконечные прямые from+dir*t с t любого знака. dir — направление, не второй конец. Параллельные и совпадающие прямые дают Nil, а не множество точек.
| Имя | Тип | По умолчанию |
|---|---|---|
fromA | Vector2 | — |
dirA | Vector2 | — |
fromB | Vector2 | — |
dirB | Vector2 | — |
fromAТочка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
dirAНенулевое направление бесконечной прямой, не её второй конец.
fromBТочка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
dirBНенулевое направление бесконечной прямой, не её второй конец.
VariantVariant с Vector2 либо Nil; после использования освободите Variant, не считайте (0,0) признаком промаха.
MakeAtlas2 перегрузки
public static Reckfell.Collections.Dictionary MakeAtlas(Vector2[] sizes);Вычисляет позиции прямоугольников без вращения, padding и создания текстуры. Vector2-размеры преобразуются в целые с отбрасыванием дроби; используйте непустой набор положительных целых размеров. Текущий поиск проверяет ширины до 4096: не передавайте более широкие прямоугольники, безопасный результат для них не подтверждён и в коде нет проверки пустого списка кандидатов перед выбором. Это source-наблюдение, аварийный вход не запускался.
| Имя | Тип | По умолчанию |
|---|---|---|
sizes | Vector2[] | — |
sizesНепустой массив положительных целых размеров, ширина каждого ≤4096; дроби отбрасываются и могут стать нулём.
Reckfell.Collections.DictionaryСобственный Dictionary: points — Vector2[] позиций по исходным индексам, size — Vector2I общего размера. Освободите словарь после чтения.
public static Reckfell.Collections.Dictionary MakeAtlas(ReadOnlySpan<Vector2> sizes);Вычисляет позиции прямоугольников без вращения, padding и создания текстуры. Vector2-размеры преобразуются в целые с отбрасыванием дроби; используйте непустой набор положительных целых размеров. Текущий поиск проверяет ширины до 4096: не передавайте более широкие прямоугольники, безопасный результат для них не подтверждён и в коде нет проверки пустого списка кандидатов перед выбором. Это source-наблюдение, аварийный вход не запускался.
| Имя | Тип | По умолчанию |
|---|---|---|
sizes | ReadOnlySpan<Vector2> | — |
sizesНепустой массив положительных целых размеров, ширина каждого ≤4096; дроби отбрасываются и могут стать нулём.
Reckfell.Collections.DictionaryСобственный Dictionary: points — Vector2[] позиций по исходным индексам, size — Vector2I общего размера. Освободите словарь после чтения.
MergePolygons2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> MergePolygons(Vector2[] polygonA, Vector2[] polygonB);Объединение A∪B по EvenOdd. Возвращает контуры, возможно несколько внешних и отверстия; не гарантирует один массив или стабильный порядок.
| Имя | Тип | По умолчанию |
|---|---|---|
polygonA | Vector2[] | — |
polygonB | Vector2[] | — |
polygonAУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
polygonBУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
public static Reckfell.Collections.Array<Vector2[]> MergePolygons(ReadOnlySpan<Vector2> polygonA, ReadOnlySpan<Vector2> polygonB);Объединение A∪B по EvenOdd. Возвращает контуры, возможно несколько внешних и отверстия; не гарантирует один массив или стабильный порядок.
| Имя | Тип | По умолчанию |
|---|---|---|
polygonA | ReadOnlySpan<Vector2> | — |
polygonB | ReadOnlySpan<Vector2> | — |
polygonAУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
polygonBУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
OffsetPolygon2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> OffsetPolygon(Vector2[] polygon, float delta, Geometry2D.PolyJoinType joinType = Geometry2D.PolyJoinType.Square);Создаёт смещённую замкнутую область: положительная delta расширяет, отрицательная сужает и может уничтожить область или разделить её. По умолчанию Square join; Miter ограничен текущим miter limit 2.0, Round аппроксимирован. Span-overload требует явный joinType.
| Имя | Тип | По умолчанию |
|---|---|---|
polygon | Vector2[] | — |
delta | float | — |
joinType | Geometry2D.PolyJoinType | Geometry2D.PolyJoinType.Square |
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
deltaЗнаковое смещение границы в единицах точек: плюс расширяет, минус сужает.
joinTypeSquare, Round или Miter для стыков; Round приближён, острый Miter ограничивается.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
public static Reckfell.Collections.Array<Vector2[]> OffsetPolygon(ReadOnlySpan<Vector2> polygon, float delta, Geometry2D.PolyJoinType joinType);Создаёт смещённую замкнутую область: положительная delta расширяет, отрицательная сужает и может уничтожить область или разделить её. По умолчанию Square join; Miter ограничен текущим miter limit 2.0, Round аппроксимирован. Span-overload требует явный joinType.
| Имя | Тип | По умолчанию |
|---|---|---|
polygon | ReadOnlySpan<Vector2> | — |
delta | float | — |
joinType | Geometry2D.PolyJoinType | — |
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
deltaЗнаковое смещение границы в единицах точек: плюс расширяет, минус сужает.
joinTypeSquare, Round или Miter для стыков; Round приближён, острый Miter ограничивается.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
OffsetPolyline2 перегрузки
public static Reckfell.Collections.Array<Vector2[]> OffsetPolyline(Vector2[] polyline, float delta, Geometry2D.PolyJoinType joinType = Geometry2D.PolyJoinType.Square, Geometry2D.PolyEndType endType = Geometry2D.PolyEndType.Square);Создаёт полигональную обводку открытой линии с полушириной abs(delta). В текущей Clipper2 отрицательное значение даёт положительную ширину, а не пустой результат. Square ends выступают за концы; Butt заканчивается у них. EndType.Polygon диагностируется: используйте OffsetPolygon. Span-overload требует оба enum явно.
| Имя | Тип | По умолчанию |
|---|---|---|
polyline | Vector2[] | — |
delta | float | — |
joinType | Geometry2D.PolyJoinType | Geometry2D.PolyJoinType.Square |
endType | Geometry2D.PolyEndType | Geometry2D.PolyEndType.Square |
polylineУпорядоченные вершины открытой линии, обычно минимум две различные точки.
deltaПолуширина обводки в единицах точек; текущий открытый offset использует abs(delta).
joinTypeSquare, Round или Miter для стыков; Round приближён, острый Miter ограничивается.
endTypeButt/Square/Round либо Joined; Polygon для OffsetPolyline запрещён. Joined соединяет концы линии, но не означает обычную заливку исходной области.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
public static Reckfell.Collections.Array<Vector2[]> OffsetPolyline(ReadOnlySpan<Vector2> polyline, float delta, Geometry2D.PolyJoinType joinType, Geometry2D.PolyEndType endType);Создаёт полигональную обводку открытой линии с полушириной abs(delta). В текущей Clipper2 отрицательное значение даёт положительную ширину, а не пустой результат. Square ends выступают за концы; Butt заканчивается у них. EndType.Polygon диагностируется: используйте OffsetPolygon. Span-overload требует оба enum явно.
| Имя | Тип | По умолчанию |
|---|---|---|
polyline | ReadOnlySpan<Vector2> | — |
delta | float | — |
joinType | Geometry2D.PolyJoinType | — |
endType | Geometry2D.PolyEndType | — |
polylineУпорядоченные вершины открытой линии, обычно минимум две различные точки.
deltaПолуширина обводки в единицах точек; текущий открытый offset использует abs(delta).
joinTypeSquare, Round или Miter для стыков; Round приближён, острый Miter ограничивается.
endTypeButt/Square/Round либо Joined; Polygon для OffsetPolyline запрещён. Joined соединяет концы линии, но не означает обычную заливку исходной области.
Reckfell.Collections.Array<Vector2[]>Array<Vector2[]> контуров; может быть пустым или содержать несколько частей/отверстия. Это не набор готовых физических объектов.
PointIsInsideTrianglebool
public static bool PointIsInsideTriangle(Vector2 point, Vector2 a, Vector2 b, Vector2 c);Проверяет знаки векторных произведений. Для внутренней точки работает при обоих обходах, но включение ребра зависит от обхода. Не гарантирует единое поведение границы и не проверяет вырожденность.
| Имя | Тип | По умолчанию |
|---|---|---|
point | Vector2 | — |
a | Vector2 | — |
b | Vector2 | — |
c | Vector2 | — |
pointПроверяемая точка в той же системе координат, что геометрия.
aВершина a невырожденного треугольника; отдельно определите правило включения границы.
bВершина b невырожденного треугольника; отдельно определите правило включения границы.
cВершина c невырожденного треугольника; отдельно определите правило включения границы.
boolЛогический результат с граничными условиями, указанными в описании метода.
SegmentIntersectsCirclefloat
public static float SegmentIntersectsCircle(Vector2 segmentFrom, Vector2 segmentTo, Vector2 circlePosition, float circleRadius);Возвращает первый допустимый корень пересечения в 0…1, иначе -1. Внешний старт даёт вход, внутренний может дать выход; касание включено. Нужен ненулевой отрезок: это квадратное уравнение с делением на квадрат длины, не универсальная point-in-circle проверка.
| Имя | Тип | По умолчанию |
|---|---|---|
segmentFrom | Vector2 | — |
segmentTo | Vector2 | — |
circlePosition | Vector2 | — |
circleRadius | float | — |
segmentFromТочка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
segmentToТочка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
circlePositionЦентр круга в общей системе координат.
circleRadiusНеотрицательный конечный радиус в единицах точек.
floatДоля t в 0…1 либо -1; точка равна segmentFrom.Lerp(segmentTo,t).
SegmentIntersectsSegmentVariant
public static Variant SegmentIntersectsSegment(Vector2 fromA, Vector2 toA, Vector2 fromB, Vector2 toB);Ищет единственную точку двух конечных отрезков, допуская общие концы при непараллельности. Коллинеарное перекрытие и вырожденный первый отрезок не дают результата; Nil не является общей проверкой отсутствия общей области.
| Имя | Тип | По умолчанию |
|---|---|---|
fromA | Vector2 | — |
toA | Vector2 | — |
fromB | Vector2 | — |
toB | Vector2 | — |
fromAТочка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
toAТочка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
fromBТочка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
toBТочка в общей системе координат. Для GetClosestPointsBetweenSegments пары именно p1–q1 и p2–q2; для LineIntersectsLine from — точка на прямой.
VariantVariant с Vector2 либо Nil; после использования освободите Variant, не считайте (0,0) признаком промаха.
TriangulateDelaunay2 перегрузки
public static int[] TriangulateDelaunay(Vector2[] points);Триангулирует облако точек по Delaunay. Порядок входа не задаёт ограничивающую вогнутую границу; внешние/внутренние ограничения и отверстия не сохраняются автоматически. Индексы идут тройками в исходный points.
| Имя | Тип | По умолчанию |
|---|---|---|
points | Vector2[] | — |
pointsКонечное облако Vector2 в общей системе координат; для Delaunay нужны невырожденные неколлинеарные данные.
int[]int[] индексов тройками в исходный массив; пустой результат возможен при отсутствии триангуляции.
public static int[] TriangulateDelaunay(ReadOnlySpan<Vector2> points);Триангулирует облако точек по Delaunay. Порядок входа не задаёт ограничивающую вогнутую границу; внешние/внутренние ограничения и отверстия не сохраняются автоматически. Индексы идут тройками в исходный points.
| Имя | Тип | По умолчанию |
|---|---|---|
points | ReadOnlySpan<Vector2> | — |
pointsКонечное облако Vector2 в общей системе координат; для Delaunay нужны невырожденные неколлинеарные данные.
int[]int[] индексов тройками в исходный массив; пустой результат возможен при отсутствии триангуляции.
TriangulatePolygon2 перегрузки
public static int[] TriangulatePolygon(Vector2[] polygon);Триангулирует один простой упорядоченный контур без отдельного набора отверстий. Возвращает индексы исходных вершин тройками; при неудаче пусто. Алгоритм может ослабить проверки для коллинеарных точек и выдать нулевые треугольники: результат не является валидатором качества.
| Имя | Тип | По умолчанию |
|---|---|---|
polygon | Vector2[] | — |
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
int[]int[] индексов тройками в исходный массив; пустой результат возможен при отсутствии триангуляции.
public static int[] TriangulatePolygon(ReadOnlySpan<Vector2> polygon);Триангулирует один простой упорядоченный контур без отдельного набора отверстий. Возвращает индексы исходных вершин тройками; при неудаче пусто. Алгоритм может ослабить проверки для коллинеарных точек и выдать нулевые треугольники: результат не является валидатором качества.
| Имя | Тип | По умолчанию |
|---|---|---|
polygon | ReadOnlySpan<Vector2> | — |
polygonУпорядоченный простой контур в общей системе координат; не повторяйте первую вершину в конце и не смешивайте несколько колец.
int[]int[] индексов тройками в исходный массив; пустой результат возможен при отсутствии триангуляции.
Geometry2D.PolyBooleanOperation
| Значение | Описание |
|---|---|
Difference = 1 | Создайте области, в которых заполнены полигоны субъекта, за исключением областей, где заполнены полигоны обрезки. |
Intersection = 2 | Создайте области, в которых заполнены как полигоны объекта, так и полигоны клипа. ОПЕРАЦИЯ_КОР |
Union = 0 | Создайте области, в которых заполнены либо объектные, либо отсекающие полигоны (или и те, и другие). |
Xor = 3 | Создавайте области, в которых заполнены либо полигоны объекта, либо полигоны обрезки, но не области, в которых заполнены оба полигона. |
Geometry2D.PolyEndType
| Значение | Описание |
|---|---|
Butt = 2 | Конечные точки имеют квадратную форму и не имеют расширения. |
Joined = 1 | Конечные точки соединяются с использованием значения |
Polygon = 0 | Конечные точки соединяются с использованием значения |
Round = 4 | Конечные точки округляются и расширяются на единицы |
Square = 3 | Конечные точки возводятся в квадрат и расширяются на единицы |
Geometry2D.PolyJoinType
| Значение | Описание |
|---|---|
Miter = 2 | Существует необходимый предел для соединений под углом, поскольку смещение кромок, которые соединяются под очень острыми углами, приведет к образованию чрезмерно длинных и узких «шипов». Для любого соединения кромок, если смещение под углом превышает максимальное расстояние, применяется «квадратное» соединение. |
Round = 1 | Хотя сглаженные траектории никогда не могут идеально описывать дугу, они аппроксимируются серией хорд дуг. |
Square = 0 | Возведение в квадрат применяется равномерно ко всем выпуклым ребрам при |