Ayudas de geometría

Tres llamadas de Geometry2D con el resultado dibujado: intersección de polígonos, envolvente convexa y offset de polígono.

El editor de arriba está ejecutando este proyecto. Cambia una línea y se recarga.

Clases de Godot usadas

Geometry2DPolygon2DLine2D

El código

scripts/main.gd
extends Node

const SEED: int = 20260814
const POINTS: int = 22
const SPREAD: Vector2 = Vector2(240, 250)

var rng: RandomNumberGenerator = RandomNumberGenerator.new()


func _ready() -> void:
	_add_background()

	rng.seed = SEED

	var view: Vector2 = get_viewport().get_visible_rect().size
	var row: float = view.y * 0.56

	_show_intersection(Vector2(view.x * 0.18, row))
	_show_hull(Vector2(view.x * 0.5, row))
	_show_offset(Vector2(view.x * 0.82, row))

	print('every shape here comes from Geometry2D, change SEED for another point cloud')


func _show_intersection(center: Vector2) -> void:
	_add_title('intersect_polygons', center)

	var hexagon: PackedVector2Array = _regular_polygon(6, 130.0, center + Vector2(-38, -22), 0.0)
	var square: PackedVector2Array = _regular_polygon(4, 145.0, center + Vector2(42, 30), 0.3)

	for piece in Geometry2D.intersect_polygons(hexagon, square):
		var fill: Polygon2D = Polygon2D.new()
		fill.polygon = piece
		fill.color = Color('#8eef97')
		add_child(fill)

	_add_outline(hexagon, Color('#8da5f3'), 2.0)
	_add_outline(square, Color('#f3d48d'), 2.0)


func _show_hull(center: Vector2) -> void:
	_add_title('convex_hull', center)

	var cloud: PackedVector2Array = PackedVector2Array()

	for i in POINTS:
		var at: Vector2 = center + Vector2(rng.randf_range(-SPREAD.x, SPREAD.x), rng.randf_range(-SPREAD.y, SPREAD.y)) * 0.5
		cloud.append(at)
		add_child(_make_circle(at, 6.0, Color('#8da5f3')))

	_add_outline(Geometry2D.convex_hull(cloud), Color('#8eef97'), 3.0)


func _show_offset(center: Vector2) -> void:
	_add_title('offset_polygon', center)

	var star: PackedVector2Array = PackedVector2Array()

	for i in 10:
		var radius: float = 108.0 if i % 2 == 0 else 54.0
		var angle: float = TAU * i / 10.0 - PI * 0.5
		star.append(center + Vector2(cos(angle), sin(angle)) * radius)

	for grown in Geometry2D.offset_polygon(star, 28.0, Geometry2D.JOIN_ROUND):
		_add_outline(grown, Color('#f3d48d'), 2.0)

	for shrunk in Geometry2D.offset_polygon(star, -14.0, Geometry2D.JOIN_ROUND):
		_add_outline(shrunk, Color('#fc7f7f'), 2.0)

	_add_outline(star, Color('#8da5f3'), 3.0)


func _regular_polygon(sides: int, radius: float, center: Vector2, rotation: float) -> PackedVector2Array:
	var points: PackedVector2Array = PackedVector2Array()

	for i in sides:
		var angle: float = TAU * i / sides + rotation
		points.append(center + Vector2(cos(angle), sin(angle)) * radius)

	return points


func _add_outline(points: PackedVector2Array, color: Color, width: float) -> void:
	var line: Line2D = Line2D.new()
	line.points = points
	line.closed = true
	line.width = width
	line.default_color = color
	add_child(line)


func _make_circle(at: Vector2, radius: float, color: Color) -> Polygon2D:
	var points: PackedVector2Array = PackedVector2Array()

	for i in 16:
		points.append(Vector2(cos(TAU * i / 16.0), sin(TAU * i / 16.0)) * radius)

	var circle: Polygon2D = Polygon2D.new()
	circle.polygon = points
	circle.color = color
	circle.position = at

	return circle


func _add_title(text: String, center: Vector2) -> void:
	var label: Label = Label.new()
	label.text = text
	label.size = Vector2(320, 24)
	label.position = center - Vector2(160, 250)
	label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
	label.add_theme_color_override('font_color', Color('#999999'))
	add_child(label)


func _add_background() -> void:
	var background: ColorRect = ColorRect.new()
	background.color = Color('#12141a')
	add_child(background)
	background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

Más ejemplos de Procedural