Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Geometry2D

继承: Object

提供常见 2D 几何运算的方法。

描述

为创建几何形状,计算形状之间的交集,以及处理 2D 中的各种其他几何操作提供了一组辅助函数。

方法

PackedVector2Array[]

clip_polygons ( PackedVector2Array polygon_a, PackedVector2Array polygon_b )

PackedVector2Array[]

clip_polyline_with_polygon ( PackedVector2Array polyline, PackedVector2Array polygon )

PackedVector2Array

convex_hull ( PackedVector2Array points )

PackedVector2Array[]

decompose_polygon_in_convex ( PackedVector2Array polygon )

PackedVector2Array[]

exclude_polygons ( PackedVector2Array polygon_a, PackedVector2Array polygon_b )

Vector2

get_closest_point_to_segment ( Vector2 point, Vector2 s1, Vector2 s2 )

Vector2

get_closest_point_to_segment_uncapped ( Vector2 point, Vector2 s1, Vector2 s2 )

PackedVector2Array

get_closest_points_between_segments ( Vector2 p1, Vector2 q1, Vector2 p2, Vector2 q2 )

PackedVector2Array[]

intersect_polygons ( PackedVector2Array polygon_a, PackedVector2Array polygon_b )

PackedVector2Array[]

intersect_polyline_with_polygon ( PackedVector2Array polyline, PackedVector2Array polygon )

bool

is_point_in_circle ( Vector2 point, Vector2 circle_position, float circle_radius )

bool

is_point_in_polygon ( Vector2 point, PackedVector2Array polygon )

bool

is_polygon_clockwise ( PackedVector2Array polygon )

Variant

line_intersects_line ( Vector2 from_a, Vector2 dir_a, Vector2 from_b, Vector2 dir_b )

Dictionary

make_atlas ( PackedVector2Array sizes )

PackedVector2Array[]

merge_polygons ( PackedVector2Array polygon_a, PackedVector2Array polygon_b )

PackedVector2Array[]

offset_polygon ( PackedVector2Array polygon, float delta, PolyJoinType join_type=0 )

PackedVector2Array[]

offset_polyline ( PackedVector2Array polyline, float delta, PolyJoinType join_type=0, PolyEndType end_type=3 )

bool

point_is_inside_triangle ( Vector2 point, Vector2 a, Vector2 b, Vector2 c ) const

float

segment_intersects_circle ( Vector2 segment_from, Vector2 segment_to, Vector2 circle_position, float circle_radius )

Variant

segment_intersects_segment ( Vector2 from_a, Vector2 to_a, Vector2 from_b, Vector2 to_b )

PackedInt32Array

triangulate_delaunay ( PackedVector2Array points )

PackedInt32Array

triangulate_polygon ( PackedVector2Array polygon )


枚举

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 为单位进行扩展。


方法说明

PackedVector2Array[] clip_polygons ( PackedVector2Array polygon_a, PackedVector2Array polygon_b )

根据 polygon_b 裁剪 polygon_a,并返回一组裁剪后的多边形。这会在多边形之间执行 OPERATION_DIFFERENCE。如果 polygon_bpolygon_a 完全重叠,则返回一个空数组。

如果 polygon_bpolygon_a 包围,则返回一个外多边形(边界)和一个内多边形(孔),可以通过调用 is_polygon_clockwise 来区分。


PackedVector2Array[] clip_polyline_with_polygon ( PackedVector2Array polyline, PackedVector2Array polygon )

根据 polygon 裁剪 polyline,并返回一组裁剪后的折线。这会在折线和多边形之间执行 OPERATION_DIFFERENCE。这个操作可以被认为是用一个封闭的形状切割一条线。


PackedVector2Array convex_hull ( PackedVector2Array points )

给出一个 Vector2 的数组,以逆时针的顺序返回凸面的点的列表。最后一个点与第一个点相同。


PackedVector2Array[] decompose_polygon_in_convex ( PackedVector2Array polygon )

polygon 分解为多个凸面,并返回一个 PackedVector2Array 的数组。


PackedVector2Array[] exclude_polygons ( PackedVector2Array polygon_a, PackedVector2Array polygon_b )

相互排除由 polygon_apolygon_b 的交集(参见 intersect_polygons)定义的公共区域,并返回一组排除的多边形。这会在多边形之间执行 OPERATION_XOR。换句话说,返回各多边形之间除公共区域之外的所有区域。

该操作可能会产生一个外多边形(边界)和一个内多边形(孔),这可以通过调用 is_polygon_clockwise 来区分。


Vector2 get_closest_point_to_segment ( Vector2 point, Vector2 s1, Vector2 s2 )

返回 2D 线段 (s1, s2) 上与 point 最接近的 2D 点。返回的点始终在指定的线段上。


Vector2 get_closest_point_to_segment_uncapped ( Vector2 point, Vector2 s1, Vector2 s2 )

返回 2D 直线 (s1, s2) 上与 point 最接近的 2D 点。返回的点可能在 (s1, s2) 线段上,也有可能不在,即直线上该线段之外的部分。


PackedVector2Array get_closest_points_between_segments ( Vector2 p1, Vector2 q1, Vector2 p2, Vector2 q2 )

给定两个 2D 线段 (p1, q1) 和 (p2, q2),找出这两个线段见距离最近的两个点。返回 PackedVector2Array,包含 (p1, q1) 和 (p2, q2) 上的点。


PackedVector2Array[] intersect_polygons ( PackedVector2Array polygon_a, PackedVector2Array polygon_b )

polygon_apolygon_b 相交,并返回一组相交的多边形。这会在多边形之间执行 OPERATION_INTERSECTION。换句话说,返回由各多边形共享的公共区域。如果没有交集,则返回一个空数组。

该操作可能会产生一个外多边形(边界)和一个内多边形(孔),这可以通过调用 is_polygon_clockwise 来区分。


PackedVector2Array[] intersect_polyline_with_polygon ( PackedVector2Array polyline, PackedVector2Array polygon )

polylinepolygon 相交,并返回一组相交的折线。这会在折线和多边形之间执行 OPERATION_INTERSECTION。这个操作可以被认为是用一个封闭的形状切割一条线。


bool is_point_in_circle ( Vector2 point, Vector2 circle_position, float circle_radius )

如果 point 在圆内或恰好位于圆的边界,则返回 true;否则返回 false


bool is_point_in_polygon ( Vector2 point, PackedVector2Array polygon )

如果 pointpolygon 内或者它恰好位于多边形的边界,则返回 true;否则返回 false


bool is_polygon_clockwise ( PackedVector2Array polygon )

如果 polygon 的顶点按顺时针顺序排序,则返回 true;否则返回 false


Variant line_intersects_line ( Vector2 from_a, Vector2 dir_a, Vector2 from_b, Vector2 dir_b )

检查两条直线 (from_a, dir_a) 和 (from_b, dir_b) 是否相交。如果相交,则返回交点 Vector2。如果不相交,则返回 null

注意:直线使用方向向量指定,而不是终点。


Dictionary make_atlas ( PackedVector2Array sizes )

给定一个表示图块的 Vector2 数组,构建一个图集。返回的字典有两个键:points 是一个 PackedVector2Array,指定每个图块的位置;size 包含整个图集的整体大小,是一个 Vector2i


PackedVector2Array[] merge_polygons ( PackedVector2Array polygon_a, PackedVector2Array polygon_b )

合并(结合)polygon_apolygon_b,并返回一组合并的多边形。这在多边形之间执行 OPERATION_UNION

该操作可能会产生一个外部多边形(边界)和多个内部多边形(孔),可以通过调用 is_polygon_clockwise 来区分它们。


PackedVector2Array[] offset_polygon ( PackedVector2Array polygon, float delta, PolyJoinType join_type=0 )

delta 单位(像素)膨胀或缩小 polygon。如果 delta 为正,则使多边形向外增长。如果 delta 为负,则使多边形向内收缩。返回一个多边形数组,因为膨胀/收缩可能会产生多个离散的多边形。如果 delta 为负,且其绝对值大约超过多边形的最小边界矩形尺寸,则返回一个空数组。

每个多边形的顶点将根据 join_type 决定进行舍入,参见 PolyJoinType

该操作可能会产生一个外部多边形(边界)和内部多边形(孔),这可以通过调用 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, 50), (150, 50), (150, 150), (50, 150)]

PackedVector2Array[] offset_polyline ( PackedVector2Array polyline, float delta, PolyJoinType join_type=0, PolyEndType end_type=3 )

polyline 膨胀或缩小 delta 个单位(像素),以产生多边形。如果 delta 为正,则使折线向外增长。返回一组多边形,因为膨胀/收缩可能会产生多个离散的多边形。如果 delta 为负,则返回一个空数组。

每个多边形的顶点将由 join_type 决定进行舍入,参见 PolyJoinType

每个多边形的端点将由 end_type 决定进行舍入,参见 PolyEndType

该操作可能会产生一个外多边形(边界)和一个内多边形(孔),这可以通过调用 is_polygon_clockwise 来区分。


bool point_is_inside_triangle ( Vector2 point, Vector2 a, Vector2 b, Vector2 c ) const

返回 point 是否位于由 abc 指定的三角形中。


float segment_intersects_circle ( Vector2 segment_from, Vector2 segment_to, Vector2 circle_position, float circle_radius )

给定 2D 线段 (segment_from, segment_to),返回该线段与圆相交的位置(0 和 1 之间的数),这个圆位于 circle_position,半径为 circle_radius。如果该线段与圆不相交,则返回 -1(同样也适用于这条线段的延长线所在的直线与圆相交,而线段本身不相交的情况)。


Variant segment_intersects_segment ( Vector2 from_a, Vector2 to_a, Vector2 from_b, Vector2 to_b )

检查两条线段 (from_a, to_a) 和 (from_b, to_b) 是否相交。如果相交,则返回交点 Vector2。如果不相交,则返回 null


PackedInt32Array triangulate_delaunay ( PackedVector2Array points )

对由离散的 points 集指定的区域进行三角化,使得任何点都不在任何生成的三角形的外接圆内。返回一个 PackedInt32Array,其中每个三角形由 points 中的三个连续点的索引组成(即返回的数组将具有 n * 3 个元素,其中 n 是找到的三角形的数量)。如果三角化没有成功,则返回一个空的 PackedInt32Array


PackedInt32Array triangulate_polygon ( PackedVector2Array polygon )

对由 polygon 中的点指定的多边形进行三角化。 返回一个 PackedInt32Array,其中每个三角形由 polygon 中的三个连续点的索引组成(即返回的数组将具有 n * 3 个元素,其中 n 是找到的三角形的数量)。输出三角形将始终为逆时针旋转,如果为顺时针旋转,则轮廓将翻转。如果三角化没有成功,则返回一个空的 PackedInt32Array