Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
Geometry2D
Успадковує: Object
Забезпечує методи для окремих геометричних операцій 2D.
Опис
Забезпечує набір допоміжних функцій для створення геометричних форм, складних перехрестя між формами та процесом різних інших геометричних операцій в 2D.
Методи
Array[Vector2i] |
bresenham_line(from: Vector2i, to: Vector2i) |
Array[PackedVector2Array] |
clip_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) |
Array[PackedVector2Array] |
clip_polyline_with_polygon(polyline: PackedVector2Array, polygon: PackedVector2Array) |
PackedVector2Array |
convex_hull(points: PackedVector2Array) |
Array[PackedVector2Array] |
decompose_polygon_in_convex(polygon: PackedVector2Array) |
Array[PackedVector2Array] |
exclude_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) |
Vector2 |
get_closest_point_to_segment(point: Vector2, s1: Vector2, s2: Vector2) |
Vector2 |
get_closest_point_to_segment_uncapped(point: Vector2, s1: Vector2, s2: Vector2) |
PackedVector2Array |
get_closest_points_between_segments(p1: Vector2, q1: Vector2, p2: Vector2, q2: Vector2) |
Array[PackedVector2Array] |
intersect_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) |
Array[PackedVector2Array] |
intersect_polyline_with_polygon(polyline: PackedVector2Array, polygon: PackedVector2Array) |
is_point_in_circle(point: Vector2, circle_position: Vector2, circle_radius: float) |
|
is_point_in_polygon(point: Vector2, polygon: PackedVector2Array) |
|
is_polygon_clockwise(polygon: PackedVector2Array) |
|
Variant |
line_intersects_line(from_a: Vector2, dir_a: Vector2, from_b: Vector2, dir_b: Vector2) |
make_atlas(sizes: PackedVector2Array) |
|
Array[PackedVector2Array] |
merge_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) |
Array[PackedVector2Array] |
offset_polygon(polygon: PackedVector2Array, delta: float, join_type: PolyJoinType = 0) |
Array[PackedVector2Array] |
offset_polyline(polyline: PackedVector2Array, delta: float, join_type: PolyJoinType = 0, end_type: PolyEndType = 3) |
point_is_inside_triangle(point: Vector2, a: Vector2, b: Vector2, c: Vector2) const |
|
segment_intersects_circle(segment_from: Vector2, segment_to: Vector2, circle_position: Vector2, circle_radius: float) |
|
Variant |
segment_intersects_segment(from_a: Vector2, to_a: Vector2, from_b: Vector2, to_b: Vector2) |
PackedInt32Array |
triangulate_delaunay(points: PackedVector2Array) |
PackedInt32Array |
triangulate_polygon(polygon: PackedVector2Array) |
Переліки
enum PolyBooleanOperation: 🔗
PolyBooleanOperation OPERATION_UNION = 0
Створення регіонів, де заповнюється або заповнюється полігони (або обидва).
PolyBooleanOperation OPERATION_DIFFERENCE = 1
Створіть регіони, де заповнюється предметні полігони, крім того, де заповнюється полігони.
PolyBooleanOperation OPERATION_INTERSECTION = 2
Створіть регіони, де заповнюється як предмет, так і кліп.
PolyBooleanOperation OPERATION_XOR = 3
Створіть регіони, де заповнюються або затискаються полігони, але не де вони заповнені.
enum PolyJoinType: 🔗
PolyJoinType JOIN_SQUARE = 0
Приєднується до всіх конвекційних кромок 1 * delta.
PolyJoinType JOIN_ROUND = 1
В той час як плоскі доріжки не можуть відмінно простежити дугу, вони приблизні серії акордів дуги.
PolyJoinType JOIN_MITER = 2
У зв’язку з нападними краями, які з'єднуються з дуже гострими кутами, виготовляють надмірно довго і вузькі «зірки». Для будь-якої даної кромки при введенні мітки буде перевищена максимальна відстань, "кваре" приєднується.
enum PolyEndType: 🔗
PolyEndType END_POLYGON = 0
Кінцеві точки долучаються за допомогою значення PolyJoinType та шляху, наповненого полігоном.
PolyEndType END_JOINED = 1
Кінцеві точки долучаються за допомогою значення PolyJoinType та шляху, наповненого полілінією.
PolyEndType END_BUTT = 2
Кінцеві точки скручуються без розширення.
PolyEndType END_SQUARE = 3
Кінцевими точками є квадратні та розширені підрозділи delta.
PolyEndType END_ROUND = 4
Кінцеві точки закруглені і розширені за допомогою delta юнітів.
Описи методів
Array[Vector2i] bresenham_line(from: Vector2i, to: Vector2i) 🔗
Повертає лінію Брезенхема між точками from і to. Лінія Брезенхема — це ряд пікселів, які малюють лінію, і завжди мають товщину 1 піксель у кожному рядку та стовпці малюнка (ніколи більше, ні менше).
Приклад коду для малювання лінії між двома вузлами Marker2D за допомогою серії викликів CanvasItem.draw_rect():
func _draw():
for pixel in Geometry2D.bresenham_line($MarkerA.position, $MarkerB.position):
draw_rect(Rect2(pixel, Vector2.ONE), Color.WHITE)
Array[PackedVector2Array] clip_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) 🔗
Кліпи polygon_a проти polygon_b і повертає масив кліпованих полігонів. Це виконує OPERATION_DIFFERENCE між полігонами. Повертає порожній масив, якщо polygon_b повністю перекриття polygon_a.
Якщо polygon_b закривається polygon_a, повертає зовнішній полігон (кордонний) і внутрішній полігон (отримка), який може відрізнятися за допомогою виклику _polygon_clockwise().
Array[PackedVector2Array] clip_polyline_with_polygon(polyline: PackedVector2Array, polygon: PackedVector2Array) 🔗
Кліпи полілін проти polygon і повертає масив затисканих полілінів. Це виконує OPERATION_DIFFERENCE між поліліном і полігоном. Ця операція може розглядатися як різання лінії закритою формою.
PackedVector2Array convex_hull(points: PackedVector2Array) 🔗
З огляду на масив Vector2s, повертає конвекційне корпус як список точок, які відповідають порядку. Останнім моментом є те ж, що і перший.
Array[PackedVector2Array] decompose_polygon_in_convex(polygon: PackedVector2Array) 🔗
Розгортання полігону polygon в декілька конвекційних корпусів і повертає масив PackedVector2Array.
Array[PackedVector2Array] exclude_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) 🔗
Мутуально виключає поширену площу, визначену перехрестям polygon_a і polygon_b (див. intersect_polygons()) і повертає масив виключених полігонів. Це виконує OPERATION_XOR між полігонами. Іншими словами, повертає всі, але загальна площа між полігонами.
Операція може призвести до зовнішнього полігону (кордонного) і внутрішнього полігону (холоща) виробництва, який може відрізнятися за допомогою виклику _polygon_clockwise().
Vector2 get_closest_point_to_segment(point: Vector2, s1: Vector2, s2: Vector2) 🔗
Повертаємо точку 2D на сегменті 2D (s1, s2), який найближчий до point. Повернутий пункт завжди буде всередині зазначеного сегмента.
Vector2 get_closest_point_to_segment_uncapped(point: Vector2, s1: Vector2, s2: Vector2) 🔗
Повертаємо точку 2D на лінію 2D, визначену (s1, s2), що найближче до point. Повернутий пункт може бути всередині сегмента (s1, s2) або зовні нього, тобто десь на лінії, що поширюється від сегмента.
PackedVector2Array get_closest_points_between_segments(p1: Vector2, q1: Vector2, p2: Vector2, q2: Vector2) 🔗
З огляду на два сегменти 2D (p1, q1) і (p2, q2), знаходить дві точки на два сегменти, які близькі один одному. Повернутися до PackedVector2Array, який містить цю точку на p1, q1, а також точки супроводження на p2, q2.
Array[PackedVector2Array] intersect_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) 🔗
Інтерсекти polygon_a з polygon_b і повертає масив інтерсекційних полігонів. Це виконує OPERATION_INTERSECTION між полігонами. Іншими словами, повертає загальну площу, поділений полігонами. Повертає порожній масив, якщо не відбувається перетин.
Операція може призвести до зовнішнього полігону (кордонного) і внутрішнього полігону (холоща) виробництва, який може відрізнятися за допомогою виклику _polygon_clockwise().
Array[PackedVector2Array] intersect_polyline_with_polygon(polyline: PackedVector2Array, polygon: PackedVector2Array) 🔗
Перетинає polyline з polygon та повертає масив перетнутих поліліній. Це виконує OPERATION_INTERSECTION між полілінією та полігоном. Цю операцію можна розглядати як розсікання лінії із замкнутою формою.
bool is_point_in_circle(point: Vector2, circle_position: Vector2, circle_radius: float) 🔗
Повертає true, якщо point знаходиться всередині кола або якщо воно розташоване точно on на межі кола, інакше повертає false.
bool is_point_in_polygon(point: Vector2, polygon: PackedVector2Array) 🔗
Повертає true, якщо point знаходиться всередині polygon або якщо він розташований точно on полігон межа, інакше повертає false.
bool is_polygon_clockwise(polygon: PackedVector2Array) 🔗
Повертаємо true, якщо polygon будуть замовлені годинниковим замовленням, інакше повертає false.
Примітка: Припустимо, що система координації коробки, де `` +x`` є правою і `` +y``. Якщо використовувати координати екрана (`` +y`` вниз), то результат буде потрібно розбити (тобто true результат буде вказувати на проти годинникової стрілки.
Variant line_intersects_line(from_a: Vector2, dir_a: Vector2, from_b: Vector2, dir_b: Vector2) 🔗
Returns the point of intersection between the two lines (from_a, dir_a) and (from_b, dir_b). Returns a Vector2, or null if the lines are parallel.
from and dir are not endpoints of a line segment or ray but the slope (dir) and a known point (from) on that line. To get the intersection between two line segments, use segment_intersects_segment().
var from_a = Vector2.ZERO
var dir_a = Vector2.RIGHT
var from_b = Vector2.DOWN
# Returns Vector2(1, 0)
Geometry2D.line_intersects_line(from_a, dir_a, from_b, Vector2(1, -1))
# Returns Vector2(-1, 0)
Geometry2D.line_intersects_line(from_a, dir_a, from_b, Vector2(-1, -1))
# Returns null
Geometry2D.line_intersects_line(from_a, dir_a, from_b, Vector2.RIGHT)
var fromA = Vector2.Zero;
var dirA = Vector2.Right;
var fromB = Vector2.Down;
// Returns new Vector2(1, 0)
Geometry2D.LineIntersectsLine(fromA, dirA, fromB, new Vector2(1, -1));
// Returns new Vector2(-1, 0)
Geometry2D.LineIntersectsLine(fromA, dirA, fromB, new Vector2(-1, -1));
// Returns null
Geometry2D.LineIntersectsLine(fromA, dirA, fromB, Vector2.Right);
Dictionary make_atlas(sizes: PackedVector2Array) 🔗
З огляду на масив Vector2, що представляє плитку, будує атлас. Повернутий словник має два ключі: `` точки`` є PackedVector2Array, що визначає позиції кожної плитки, size містить загальний розмір всього атласу, як Vector2i.
Array[PackedVector2Array] merge_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) 🔗
polygon_a і polygon_b і повертає масив зливних полігонів. Це виконує OPERATION_UNION між полігонами.
Операція може призвести до зовнішнього полігону (корпусного) і декількох внутрішніх полігонів (холок) виробництва яких можна відрізняти за допомогою виклику _polygon_clockwise().
Array[PackedVector2Array] offset_polygon(polygon: PackedVector2Array, delta: float, join_type: PolyJoinType = 0) 🔗
Збільшує або зменшує polygon на delta одиниць (пікселів). Якщо delta додатне, полігон зростає назовні. Якщо delta від'ємне, полігон стискає всередину. Повертає масив полігонів, оскільки роздування/зменшення може призвести до появи кількох дискретних полігонів. Повертає порожній масив, якщо delta від'ємне, а його абсолютне значення приблизно перевищує мінімальні розміри обмежувального прямокутника полігону.
Вершини кожного полігону будуть заокруглені, як визначено join_type.
Операція може призвести до створення зовнішнього полігону (межі) та внутрішнього полігону (діри), які можна розрізнити, викликавши is_polygon_clockwise().
Примітка: Щоб перевести вершини полігону, помножте їх на Transform2D:
var polygon = PackedVector2Array([Vector2(0, 0), Vector2(100, 0), Vector2(100, 100), Vector2(0, 100)])
var offset = Vector2(50, 50)
polygon = Transform2D(0, offset) * polygon
print(polygon) # Виводить [(50.0, 50.0), (150.0, 50.0), (150.0, 150.0), (50.0, 150.0)]
Vector2[] polygon = [new Vector2(0, 0), new Vector2(100, 0), new Vector2(100, 100), new Vector2(0, 100)];
var offset = new Vector2(50, 50);
polygon = new Transform2D(0, offset) * polygon;
GD.Print((Variant)polygon); // Друкує [(50, 50), (150, 50), (150, 150), (50, 150)]
Array[PackedVector2Array] offset_polyline(polyline: PackedVector2Array, delta: float, join_type: PolyJoinType = 0, end_type: PolyEndType = 3) 🔗
Надуває або здуває polyline на delta одиниць (пікселів), створюючи полігони. Якщо delta додатне, змушує полілінію зростати назовні. Повертає масив полігонів, оскільки надування/здуття може призвести до появи кількох дискретних полігонів. Якщо delta від'ємне, повертає порожній масив.
Вершини кожного полігону будуть заокруглені, як визначено join_type.
Кінцеві точки кожного полігону будуть заокруглені, як визначено end_type.
Операція може призвести до створення зовнішнього полігону (межі) та внутрішнього полігону (діри), які можна розрізнити, викликавши is_polygon_clockwise().
bool point_is_inside_triangle(point: Vector2, a: Vector2, b: Vector2, c: Vector2) const 🔗
Повертає, якщо point знаходиться всередині трикутника, визначеного a, b та c.
float segment_intersects_circle(segment_from: Vector2, segment_to: Vector2, circle_position: Vector2, circle_radius: float) 🔗
З огляду на 2D сегмент (segment_from, segment_to), повертає положення на сегменті (як число від 0 до 1), при якому сегмент потрапляє в коло, який знаходиться в положенні circle_position і має Радіус circle_radius. Якщо сегмент не перетинає коло, -1 повертається (це також так, якщо лінія, що розширює сегмент, перетинає коло, але сегмент не).
Variant segment_intersects_segment(from_a: Vector2, to_a: Vector2, from_b: Vector2, to_b: Vector2) 🔗
Checks if two line segments intersect, with line a between from_a and to_a and line b between from_b and to_b. If the line segments intersect, the point of intersection is returned as a Vector2. If no intersection takes place, null is returned.
PackedInt32Array triangulate_delaunay(points: PackedVector2Array) 🔗
Трианггулює область, зазначену за допомогою дискретного набору points, що немає сенсу всередині обміну будь-якого отриманого трикутника. Повертає Packedint32Array, де кожен трикутник складається з трьох послідовних точкових індексів у puls (I.E. Повернений масив буде мати `` n * 3 `` елементів, з `` n `` - це кількість знайдених трикутники). Якщо триангуляція не вдалося, порожній Packedint32Array повертається.
PackedInt32Array triangulate_polygon(polygon: PackedVector2Array) 🔗
Триангулює полігон, вказаний точками polygon. Повертаємо PackedInt32Array, де кожен трикутник складається з трьох послідовних індексів точки в polygon (тобто повернутий масив буде мати n * 3 елементи, з n є числом знайдених трикутників). Вихідні трикутники завжди будуть проти годинникової стрілки, а контур буде розбитий, якщо це годинниковою стрілкою. Якщо тріангуляція не вдалося, порожня PackedInt32Array повертається.