交集、差集、并集
场景中添加三个 CollisionPolygon2D 节点,设置前两个 CollisionPolygon2D 的图形 union()
、intersection()
、difference_set()
。
extends StaticBody2D
export var from_a : NodePath
export var from_b : NodePath
export var to : NodePath
onready var collision1 = get_node(from_a)
onready var collision2 = get_node(from_b)
onready var collision3 = get_node(to)
func _ready():
pass
union()
# intersection()
# difference_set()
collision1.queue_free()
collision2.queue_free()
## 并集
func union():
var arr = Geometry.merge_polygons_2d(collision1.polygon, collision2.polygon)
collision3.polygon = arr[0]
## 交集
func intersection():
var arr = Geometry.intersect_polygons_2d(collision1.polygon, collision2.polygon)
collision3.polygon = arr[0]
## 差集
func difference_set():
# 如果其中一个图形包含到了另一个图形的内部
# 则无法创建出差集,所以需要让两个有不相交
# 的部分,注意节点位置
# 取末尾点
var end_point := collision2.polygon[collision2.polygon.size()-1] as Vector2
var end2_point := collision2.polygon[collision2.polygon.size()-2] as Vector2
var dir1 = end2_point.direction_to(end_point)
var dist = 1
var p = collision2.polygon
var midden_point = end_point + dir1 * dist * 1.5 # 中间点
p.append(end_point + dir1 * dist)
# 中间点移动到两点之间方向旋转90°后1000的位置
p.append(midden_point - dir1.rotated(PI/2) * 1000)
p.append(end_point + dir1 * dist * 2)
collision2.polygon = p
var arr = Geometry.clip_polygons_2d(collision1.polygon, collision2.polygon)
collision3.polygon = arr[0]