Ajudantes de geometria
Três chamadas de Geometry2D com o resultado desenhado: interseção de polígonos, envoltória convexa e offset de polígono.
O editor acima está rodando este projeto. Mude uma linha e ele recarrega.
Classes do Godot usadas
Geometry2DPolygon2DLine2D
O 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)