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
为单位进行扩展。
方法说明
Array[PackedVector2Array] clip_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) 🔗
根据 polygon_b
裁剪 polygon_a
,并返回一组裁剪后的多边形。这会在多边形之间执行 OPERATION_DIFFERENCE。如果 polygon_b
与 polygon_a
完全重叠,则返回一个空数组。
如果 polygon_b
被 polygon_a
包围,则返回一个外多边形(边界)和一个内多边形(孔),可以通过调用 is_polygon_clockwise 来区分。
Array[PackedVector2Array] clip_polyline_with_polygon(polyline: PackedVector2Array, polygon: PackedVector2Array) 🔗
根据 polygon
裁剪 polyline
,并返回一组裁剪后的折线。这会在折线和多边形之间执行 OPERATION_DIFFERENCE。这个操作可以被认为是用一个封闭的形状切割一条线。
PackedVector2Array convex_hull(points: PackedVector2Array) 🔗
给出一个 Vector2 的数组,以逆时针的顺序返回凸面的点的列表。最后一个点与第一个点相同。
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。换句话说,返回各多边形之间除公共区域之外的所有区域。
该操作可能会产生一个外多边形(边界)和一个内多边形(孔),这可以通过调用 is_polygon_clockwise 来区分。
Vector2 get_closest_point_to_segment(point: Vector2, s1: Vector2, s2: Vector2) 🔗
返回 2D 线段 (s1
, s2
) 上与 point
最接近的 2D 点。返回的点始终在指定的线段上。
Vector2 get_closest_point_to_segment_uncapped(point: Vector2, s1: Vector2, s2: Vector2) 🔗
返回 2D 直线 (s1
, s2
) 上与 point
最接近的 2D 点。返回的点可能在 (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。换句话说,返回由各多边形共享的公共区域。如果没有交集,则返回一个空数组。
该操作可能会产生一个外多边形(边界)和一个内多边形(孔),这可以通过调用 is_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) 🔗
如果 point
在圆内或恰好位于圆的边界上,则返回 true
;否则返回 false
。
bool is_point_in_polygon(point: Vector2, polygon: PackedVector2Array) 🔗
如果 point
在 polygon
内或者它恰好位于多边形的边界上,则返回 true
;否则返回 false
。
bool is_polygon_clockwise(polygon: PackedVector2Array) 🔗
如果 polygon
的顶点按顺时针顺序排列,则返回 true
,否则返回 false
。
注意:假设笛卡尔坐标系中 +x
为右,+y
为上。如果使用屏幕坐标(+y
为下),则需要翻转结果(即 true
结果将标识是逆时针)。
Variant line_intersects_line(from_a: Vector2, dir_a: Vector2, from_b: Vector2, dir_b: Vector2) 🔗
检查两条直线 (from_a
, dir_a
) 和 (from_b
, dir_b
) 是否相交。如果相交,则返回交点 Vector2。如果不相交,则返回 null
。
注意:直线使用方向向量指定,而不是终点。
Dictionary make_atlas(sizes: PackedVector2Array) 🔗
给定一个表示图块的 Vector2 数组,构建一个图集。返回的字典有两个键:points
是一个 PackedVector2Array,指定每个图块的位置;size
包含整个图集的整体大小,是一个 Vector2i。
Array[PackedVector2Array] merge_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) 🔗
合并(结合)polygon_a
和 polygon_b
,并返回一组合并的多边形。这在多边形之间执行 OPERATION_UNION。
该操作可能会产生一个外部多边形(边界)和多个内部多边形(孔),可以通过调用 is_polygon_clockwise 来区分它们。
Array[PackedVector2Array] offset_polygon(polygon: PackedVector2Array, delta: float, join_type: PolyJoinType = 0) 🔗
按 delta
单位(像素)膨胀或缩小 polygon
。如果 delta
为正,则使多边形向外增长。如果 delta
为负,则使多边形向内收缩。返回一个多边形数组,因为膨胀/收缩可能会产生多个离散的多边形。如果 delta
为负,且其绝对值大约超过多边形的最小边界矩形尺寸,则返回一个空数组。
每个多边形的顶点将根据 join_type
决定进行舍入,参见 PolyJoinType。
该操作可能会产生一个外部多边形(边界)和内部多边形(孔),这可以通过调用 is_polygon_clockwise 来区分。
注意:要具体平移多边形的顶点,将它们乘以一个 Transform2D:
GDScriptC#
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)]
Array[PackedVector2Array] offset_polyline(polyline: PackedVector2Array, delta: float, join_type: PolyJoinType = 0, end_type: PolyEndType = 3) 🔗
将 polyline
膨胀或缩小 delta
个单位(像素),以产生多边形。如果 delta
为正,则使折线向外增长。返回一组多边形,因为膨胀/收缩可能会产生多个离散的多边形。如果 delta
为负,则返回一个空数组。
每个多边形的顶点将由 join_type
决定进行舍入,参见 PolyJoinType。
每个多边形的端点将由 end_type
决定进行舍入,参见 PolyEndType。
该操作可能会产生一个外多边形(边界)和一个内多边形(孔),这可以通过调用 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) 🔗
检查两条线段 (from_a
, to_a
) 和 (from_b
, to_b
) 是否相交。如果相交,则返回交点 Vector2。如果不相交,则返回 null
。
PackedInt32Array triangulate_delaunay(points: PackedVector2Array) 🔗
对由离散的 points
集指定的区域进行三角化,使得任何点都不在任何生成的三角形的外接圆内。返回一个 PackedInt32Array,其中每个三角形由 points
中的三个连续点的索引组成(即返回的数组将具有 n * 3
个元素,其中 n
是找到的三角形的数量)。如果三角化没有成功,则返回一个空的 PackedInt32Array。
PackedInt32Array triangulate_polygon(polygon: PackedVector2Array) 🔗
对由 polygon
中的点指定的多边形进行三角化。 返回一个 PackedInt32Array,其中每个三角形由 polygon
中的三个连续点的索引组成(即返回的数组将具有 n * 3
个元素,其中 n
是找到的三角形的数量)。输出三角形将始终为逆时针旋转,如果为顺时针旋转,则轮廓将翻转。如果三角化没有成功,则返回一个空的 PackedInt32Array。