【Godot】多边形的交集、差集、并集

交集、差集、并集

场景中添加三个 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]

发表评论