|
|
|
@ -10,11 +10,19 @@ var data = { |
|
|
|
spacing = default_spacing |
|
|
|
spacing = default_spacing |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var polygon_data = { |
|
|
|
|
|
|
|
width = 500, |
|
|
|
|
|
|
|
height = 500, |
|
|
|
|
|
|
|
spacing = 1.5 |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var poisson_disc_sampling: PoissonDiscSampling = PoissonDiscSampling.new() |
|
|
|
var poisson_disc_sampling: PoissonDiscSampling = PoissonDiscSampling.new() |
|
|
|
var points = PoolByteArray() |
|
|
|
var points = PoolByteArray() |
|
|
|
var poissons = [] |
|
|
|
var poissons = [] |
|
|
|
|
|
|
|
var truncs = [] |
|
|
|
|
|
|
|
|
|
|
|
signal new_poisson(points) |
|
|
|
signal new_poisson(points) |
|
|
|
|
|
|
|
signal new_truncs(truncs) |
|
|
|
|
|
|
|
|
|
|
|
func _ready(): |
|
|
|
func _ready(): |
|
|
|
reset_options(default_width, default_height, default_spacing) |
|
|
|
reset_options(default_width, default_height, default_spacing) |
|
|
|
@ -72,3 +80,66 @@ func _on_OpenFileDialog_file_selected(path): |
|
|
|
reset_options(new_data.width, new_data.height, new_data.spacing) |
|
|
|
reset_options(new_data.width, new_data.height, new_data.spacing) |
|
|
|
points = file.get_var() |
|
|
|
points = file.get_var() |
|
|
|
emit_signal("new_poisson", points) |
|
|
|
emit_signal("new_poisson", points) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _on_trunc_pressed(): |
|
|
|
|
|
|
|
truncs = [] |
|
|
|
|
|
|
|
# Création d'un polygon |
|
|
|
|
|
|
|
var polygon = PoolVector2Array([ |
|
|
|
|
|
|
|
Vector2(0, 0), |
|
|
|
|
|
|
|
Vector2(polygon_data.width, 0), |
|
|
|
|
|
|
|
Vector2(polygon_data.width, |
|
|
|
|
|
|
|
polygon_data.height), |
|
|
|
|
|
|
|
Vector2(0, polygon_data.height) |
|
|
|
|
|
|
|
]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Exemple d'hexagone |
|
|
|
|
|
|
|
polygon = PoolVector2Array([ |
|
|
|
|
|
|
|
Vector2(200, 0), |
|
|
|
|
|
|
|
Vector2(400, 133), |
|
|
|
|
|
|
|
Vector2(400, 266), |
|
|
|
|
|
|
|
Vector2(200, 400), |
|
|
|
|
|
|
|
Vector2(0, 266), |
|
|
|
|
|
|
|
Vector2(0, 133), |
|
|
|
|
|
|
|
]) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Spacing |
|
|
|
|
|
|
|
# Si sup à celui de base, le polygon doit se rétrécir proportionnellement |
|
|
|
|
|
|
|
# Les positions des points augmentent à la fin |
|
|
|
|
|
|
|
# Et inversement |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var factor = float(polygon_data.spacing) / float(data.spacing) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for i in polygon.size(): |
|
|
|
|
|
|
|
var vector = Vector2(polygon[i].x / factor, polygon[i].y / factor) |
|
|
|
|
|
|
|
polygon.set(i, vector) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var max_point = Vector2(0, 0) |
|
|
|
|
|
|
|
for point in polygon: |
|
|
|
|
|
|
|
if point.x > max_point.x: |
|
|
|
|
|
|
|
max_point.x = point.x |
|
|
|
|
|
|
|
if point.y > max_point.y: |
|
|
|
|
|
|
|
max_point.y = point.y |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Déplacement du polygon de telle sorte qu'il reste dans le carré original. |
|
|
|
|
|
|
|
var rng = RandomNumberGenerator.new() |
|
|
|
|
|
|
|
rng.randomize() |
|
|
|
|
|
|
|
var offset = Vector2(rng.randi_range(0, data.width - max_point.x), rng.randi_range(0, data.height - max_point.y)) |
|
|
|
|
|
|
|
polygon = Transform2D(0, offset).xform(polygon) |
|
|
|
|
|
|
|
max_point += offset |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# On récupère les points à l'intérieur du polygon |
|
|
|
|
|
|
|
for i in range(offset.x, max_point.x): |
|
|
|
|
|
|
|
for j in range(offset.y, max_point.y): |
|
|
|
|
|
|
|
var trunc = Vector2(i, j) |
|
|
|
|
|
|
|
if Geometry.is_point_in_polygon(trunc, polygon): |
|
|
|
|
|
|
|
if points[i + j * data.width]: |
|
|
|
|
|
|
|
trunc -= offset |
|
|
|
|
|
|
|
trunc *= factor |
|
|
|
|
|
|
|
truncs.append(trunc) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
emit_signal("new_truncs", truncs) |
|
|
|
|