Iterator classes : Triangles, Edges, Points

pull/4/head
Alain STARK 3 years ago
parent 10140bf69c
commit 71464565c5
  1. 124
      utils/terrain/Terrain.gd

@ -2,6 +2,34 @@ extends Reference
class_name Terrain class_name Terrain
class Triangles:
var _terrain
var _curr
var _end
func _init(terrain):
self._terrain = terrain
self._curr = 0
self._end = _terrain._triangles.size() / 3
func _should_continue():
return (_curr < _end)
func _iter_init(arg):
_curr = 0
return _should_continue()
func _iter_next(arg):
_curr += 1
return _should_continue()
func _iter_get(arg):
var triangle = Triangle.new(_curr,_terrain)
return triangle
func size():
return _end
class Triangle: class Triangle:
var _idx var _idx
var _terrain var _terrain
@ -50,7 +78,40 @@ class Triangle:
var points = points() var points = points()
return (points[0].point3d() + points[1].point3d() + points[2].point3d()) / 3.0 return (points[0].point3d() + points[1].point3d() + points[2].point3d()) / 3.0
func polygon():
var polygon = []
for point in points():
polygon.append(point.point2d())
return polygon
class Points:
var _terrain
var _curr
var _end
func _init(terrain):
self._terrain = terrain
self._curr = 0
self._end = _terrain._points.size()
func _should_continue():
return (_curr < _end)
func _iter_init(arg):
_curr = 0
return _should_continue()
func _iter_next(arg):
_curr += 1
return _should_continue()
func _iter_get(arg):
var point = Point.new(_curr,_terrain)
return point
func size():
return _end
class Point: class Point:
var _idx var _idx
var _terrain var _terrain
@ -112,6 +173,34 @@ class Point:
if not (incoming_edge._idx != -1 and incoming_edge._idx != incoming): if not (incoming_edge._idx != -1 and incoming_edge._idx != incoming):
break break
return list_points return list_points
class Edges:
var _terrain
var _curr
var _end
func _init(terrain):
self._terrain = terrain
self._curr = 0
self._end = _terrain._triangles.size()
func _should_continue():
return (_curr < _end)
func _iter_init(arg):
_curr = 0
return _should_continue()
func _iter_next(arg):
_curr += 1
return _should_continue()
func _iter_get(arg):
var edge = Edge.new(_curr,_terrain)
return edge
func size():
return _end
class Edge: class Edge:
var _idx var _idx
@ -149,6 +238,9 @@ class Edge:
func end(): func end():
return Point.new(_terrain._triangles[next_half()._idx], _terrain) return Point.new(_terrain._triangles[next_half()._idx], _terrain)
func opposite():
return Edge.new(_terrain._halfedges[_idx], _terrain)
const terrain_file = "user://terrain.save" const terrain_file = "user://terrain.save"
@ -228,14 +320,16 @@ func _create_points():
_points[point_idx].z = points2d[point_idx].y _points[point_idx].z = points2d[point_idx].y
func get_triangles(): func get_triangles():
return _triangles var triangles = Triangles.new(self)
return triangles
func get_halfedges(): func get_edges():
return _halfedges var edges = Edges.new(self)
return edges
# return que les id ?
func get_points(): func get_points():
return _points var points = Points.new(self)
return points
func get_point(idx): func get_point(idx):
return Point.new(idx, self) return Point.new(idx, self)
@ -291,18 +385,14 @@ func _load():
func get_triangles_as_polygon(): func get_triangles_as_polygon():
var list_polygon = [] var list_polygon = []
for triangle_idx in triangles(): for triangle in get_triangles():
var polygon = [] list_polygon.append(triangle.polygon())
for point in get_triangle(triangle_idx).points():
polygon.append(point.point2d())
list_polygon.append(polygon)
return list_polygon return list_polygon
func get_edges_as_line(): func get_edges_as_line():
var list_lines = [] var list_lines = []
for edge_idx in edges(): for edge in get_edges():
var line = [] var line = []
var edge = get_edge(edge_idx)
line.append(edge.start().point2d()) line.append(edge.start().point2d())
line.append(edge.end().point2d()) line.append(edge.end().point2d())
list_lines.append(line) list_lines.append(line)
@ -310,11 +400,10 @@ func get_edges_as_line():
func get_voronoi_edges_as_line(): func get_voronoi_edges_as_line():
var list_lines = [] var list_lines = []
for edge_idx in edges(): for start_edge in get_edges():
var line = [] var line = []
var start_edge = get_edge(edge_idx) var end_edge = start_edge.opposite()
var end_edge = get_edge(_halfedges[edge_idx]) if (start_edge.get_index() < end_edge.get_index()):
if (edge_idx < _halfedges[edge_idx]):
line.append(start_edge.triangle().center2d()) line.append(start_edge.triangle().center2d())
line.append(end_edge.triangle().center2d()) line.append(end_edge.triangle().center2d())
list_lines.append(line) list_lines.append(line)
@ -322,8 +411,7 @@ func get_voronoi_edges_as_line():
func get_voronoi_cells_as_polygon(): func get_voronoi_cells_as_polygon():
var list_polygon = [] var list_polygon = []
for point_idx in points(): for point in get_points():
var point = get_point(point_idx)
var polygon = [] var polygon = []
for edge in point.edges_around(): for edge in point.edges_around():
polygon.append(edge.triangle().center2d()) polygon.append(edge.triangle().center2d())

Loading…
Cancel
Save