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 中的各种其他几何操作提供了一组辅助函数。
方法¶
枚举¶
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_b
与 polygon_a
完全重叠,则返回一个空数组。
如果 polygon_b
被 polygon_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_a
和 polygon_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_a
与 polygon_b
相交,并返回一组相交的多边形。这会在多边形之间执行 OPERATION_INTERSECTION。换句话说,返回由各多边形共享的公共区域。如果没有交集,则返回一个空数组。
该操作可能会产生一个外多边形(边界)和一个内多边形(孔),这可以通过调用 is_polygon_clockwise 来区分。
PackedVector2Array[] intersect_polyline_with_polygon ( PackedVector2Array polyline, PackedVector2Array polygon )
将 polyline
与 polygon
相交,并返回一组相交的折线。这会在折线和多边形之间执行 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 )
如果 point
在 polygon
内或者它恰好位于多边形的边界上,则返回 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_a
和 polygon_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)]
var polygon = new Vector2[] { 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)]
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
是否位于由 a
、b
、c
指定的三角形中。
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。