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[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_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。
from 和 dir 不是线段或射线的端点,而是直线的斜率(dir)和直线上的一个已知点(from)。
var from_a = Vector2.ZERO
var dir_a = Vector2.RIGHT
var from_b = Vector2.DOWN
# 返回 Vector2(1, 0)
Geometry2D.line_intersects_line(from_a, dir_a, from_b, Vector2(1, -1))
# 返回 Vector2(-1, 0)
Geometry2D.line_intersects_line(from_a, dir_a, from_b, Vector2(-1, -1))
# 返回 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;
// 返回新的 Vector2(1, 0)
Geometry2D.LineIntersectsLine(fromA, dirA, fromB, new Vector2(1, -1));
// 返回新的 Vector2(-1, 0)
Geometry2D.LineIntersectsLine(fromA, dirA, fromB, new Vector2(-1, -1));
// 返回 null
Geometry2D.LineIntersectsLine(fromA, dirA, fromB, Vector2.Right);
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 决定进行舍入。
该操作可能会产生一个外部多边形(边界)和内部多边形(孔),这可以通过调用 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) 🔗
检查两条线段 (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。