Geometry2D

继承: Object

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

描述

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

方法

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)

bool

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

bool

is_point_in_polygon(point: Vector2, polygon: PackedVector2Array)

bool

is_polygon_clockwise(polygon: PackedVector2Array)

Variant

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

Dictionary

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)

bool

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

float

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[PackedVector2Array] clip_polygons(polygon_a: PackedVector2Array, polygon_b: PackedVector2Array) 🔗

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

如果 polygon_bpolygon_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_apolygon_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_apolygon_b 相交,并返回一组相交的多边形。这会在多边形之间执行 OPERATION_INTERSECTION。换句话说,返回由各多边形共享的公共区域。如果没有交集,则返回一个空数组。

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


Array[PackedVector2Array] intersect_polyline_with_polygon(polyline: PackedVector2Array, polygon: PackedVector2Array) 🔗

polylinepolygon 相交,并返回一组相交的折线。这会在折线和多边形之间执行 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) 🔗

如果 pointpolygon 内或者它恰好位于多边形的边界,则返回 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_apolygon_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#

  1. var polygon = PackedVector2Array([Vector2(0, 0), Vector2(100, 0), Vector2(100, 100), Vector2(0, 100)])
  2. var offset = Vector2(50, 50)
  3. polygon = Transform2D(0, offset) * polygon
  4. print(polygon) # 输出 [(50, 50), (150, 50), (150, 150), (50, 150)]
  1. var polygon = new Vector2[] { new Vector2(0, 0), new Vector2(100, 0), new Vector2(100, 100), new Vector2(0, 100) };
  2. var offset = new Vector2(50, 50);
  3. polygon = new Transform2D(0, offset) * polygon;
  4. 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 是否位于由 abc 指定的三角形中。


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