Skip to content

Commit d3315ce

Browse files
committed
disapearing polygons.....now fixed :D
polygon lib calculate triangle area sometimes returned invalid value -> caused by sqrt of negative number
1 parent f6e8e47 commit d3315ce

File tree

3 files changed

+26
-24
lines changed

3 files changed

+26
-24
lines changed

demo/src/RigidBody2D.tscn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ show_behind_parent = true
2222
color = Color( 0.545098, 0.545098, 0.545098, 1 )
2323

2424
[node name="Line2D" type="Line2D" parent="Polygon2D"]
25-
default_color = Color( 1.5, 1.5, 1.5, 1 )
25+
default_color = Color( 1.35, 1.35, 1.35, 1 )
2626
joint_mode = 2
2727
begin_cap_mode = 2
2828
end_cap_mode = 2

polygon2d-fracture/PolygonFracture.gd

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,8 @@ func fractureSimple(source_polygon : PoolVector2Array, world_pos : Vector2, worl
6666
var triangulation : Dictionary = PolygonLib.triangulatePolygon(poly, true, true)
6767

6868
if triangulation.area > min_discard_area:
69-
var shape_info : Dictionary = PolygonLib.getShapeInfo(Transform2D(world_rot_rad, world_pos), poly, false)
70-
shape_info.area = triangulation.area
69+
var shape_info : Dictionary = PolygonLib.getShapeInfoSimple(Transform2D(world_rot_rad, world_pos), poly, triangulation)
7170
fracture_info.append(shape_info)
72-
# fracture_info.append(PolygonLib.makeShapeInfo(poly, PolygonLib.getPolygonCentroid(triangulation.triangles, triangulation.area), world_pos, triangulation.area))
7371

7472
return fracture_info
7573

@@ -100,10 +98,8 @@ func fracture(source_polygon : PoolVector2Array, world_pos : Vector2, world_rot_
10098
var triangulation : Dictionary = PolygonLib.triangulatePolygon(poly, true, true)
10199

102100
if triangulation.area > min_discard_area:
103-
var shape_info : Dictionary = PolygonLib.getShapeInfo(Transform2D(world_rot_rad, world_pos), poly, false)
104-
shape_info.area = triangulation.area
101+
var shape_info : Dictionary = PolygonLib.getShapeInfoSimple(Transform2D(world_rot_rad, world_pos), poly, triangulation)
105102
fracture_info.append(shape_info)
106-
# fracture_info.append(PolygonLib.makeShapeInfo(poly, PolygonLib.getPolygonCentroid(triangulation.triangles, triangulation.area), world_pos, triangulation.area))
107103

108104
return fracture_info
109105

@@ -129,14 +125,11 @@ func fractureDelaunay(source_polygon : PoolVector2Array, world_pos : Vector2, wo
129125
if area >= min_discard_area:
130126
var centroid : Vector2 = PolygonLib.getTriangleCentroid(r)
131127
fracture_info.append(PolygonLib.makeShapeInfo(PolygonLib.translatePolygon(r, -centroid), centroid, world_pos, triangle.area))
132-
# fracture_info.append(PolygonLib.makeShapeInfo(r, PolygonLib.getTriangleCentroid(r), world_pos, area))
133128
else:
134129
var t : Dictionary = PolygonLib.triangulatePolygon(r, true, true)
135130
if t.area >= min_discard_area:
136-
var shape_info : Dictionary = PolygonLib.getShapeInfo(Transform2D(world_rot_rad, world_pos), triangle.points, false)
137-
shape_info.area = triangle.area
131+
var shape_info : Dictionary = PolygonLib.getShapeInfoSimple(Transform2D(world_rot_rad, world_pos), triangle.points, t)
138132
fracture_info.append(shape_info)
139-
# fracture_info.append(PolygonLib.makeShapeInfo(r, PolygonLib.getPolygonCentroid(t.triangles, t.area), world_pos, t.area))
140133

141134
return fracture_info
142135

@@ -199,14 +192,14 @@ func cutFracture(source_polygon : PoolVector2Array, cut_polygon : PoolVector2Arr
199192
var shape_infos : Array = []
200193
if cut_info.final and cut_info.final.size() > 0:
201194
for shape in cut_info.final:
202-
var shape_area : float = PolygonLib.getPolygonArea(shape)
195+
var triangulation : Dictionary = PolygonLib.triangulatePolygon(shape)
196+
var shape_area : float = triangulation.area#PolygonLib.getPolygonArea(shape)
203197
if shape_area < cut_min_area:
204198
var fracture_info : Array = fractureDelaunay(shape, source_trans_global.get_origin(), 0.0, fractures, shard_min_area)
205199
fracture_infos.append(fracture_info)
206200
continue
207201

208-
var shape_info : Dictionary = PolygonLib.getShapeInfo(source_trans_global, shape, false)
209-
shape_info.area = shape_area
202+
var shape_info : Dictionary = PolygonLib.getShapeInfoSimple(source_trans_global, shape, triangulation)
210203
shape_infos.append(shape_info)
211204

212205
return {"shapes" : shape_infos, "fractures" : fracture_infos}

polygon2d-fracture/PolygonLib.gd

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ static func makeTriangles(poly : PoolVector2Array, triangle_points : PoolIntArra
1212
var total_area : float = 0.0
1313
for i in range(triangle_points.size() / 3):
1414
var index : int = i * 3
15-
var points : Array = [poly[triangle_points[index]], poly[triangle_points[index + 1]], poly[triangle_points[index + 2]]]
15+
var points : PoolVector2Array = [poly[triangle_points[index]], poly[triangle_points[index + 1]], poly[triangle_points[index + 2]]]
1616

1717
var area : float = 0.0
1818
if with_area:
@@ -34,7 +34,7 @@ static func makeTriangle(points : PoolVector2Array, area : float, centroid : Vec
3434
#triangulates a polygon and additionally calculates the centroid and area of each triangle alongside the total area of the polygon
3535
static func triangulatePolygon(poly : PoolVector2Array, with_area : bool = true, with_centroid : bool = true) -> Dictionary:
3636
var total_area : float = 0.0
37-
var triangle_points = Geometry.triangulate_polygon(poly)
37+
var triangle_points : PoolIntArray = Geometry.triangulate_polygon(poly)
3838
return makeTriangles(poly, triangle_points, with_area, with_centroid)
3939

4040
#triangulates a polygon with the delaunay method and additionally calculates the centroid and area of each triangle alongside the total area of the polygon
@@ -161,7 +161,11 @@ static func getTriangleArea(points : PoolVector2Array) -> float:
161161
var c : float = (points[0] - points[1]).length()
162162
var s : float = (a + b + c) * 0.5
163163

164-
return sqrt(s * (s - a) * (s - b) * (s - c))
164+
var value : float = s * (s - a) * (s - b) * (s - c)
165+
if value < 0.0:
166+
return 1.0
167+
var area : float = sqrt(value)
168+
return area
165169

166170

167171
static func getTriangleCentroid(points : PoolVector2Array) -> Vector2:
@@ -260,8 +264,8 @@ static func cutShape(source_polygon : PoolVector2Array, cut_polygon : PoolVector
260264
var intersected_polygons : Array = intersectPolygons(source_polygon, cut_polygon, true)
261265
if intersected_polygons.size() <= 0:
262266
return {"final" : [], "intersected" : []}
263-
var final_polygons : Array = clipPolygons(source_polygon, cut_polygon, true)
264267

268+
var final_polygons : Array = clipPolygons(source_polygon, cut_polygon, true)
265269

266270
return {"final" : final_polygons, "intersected" : intersected_polygons}
267271

@@ -270,13 +274,18 @@ static func cutShape(source_polygon : PoolVector2Array, cut_polygon : PoolVector
270274
static func makeShapeInfo(centered_shape : PoolVector2Array, centroid : Vector2, world_pos : Vector2, area : float) -> Dictionary:
271275
return {"centered_shape" : centered_shape, "centroid" : centroid, "world_pos" : world_pos, "area" : area}
272276

273-
static func getShapeInfo(source_global_trans : Transform2D, source_polygon : PoolVector2Array, calculate_area : bool = false) -> Dictionary:
274-
var centroid : Vector2 = calculatePolygonCentroid(source_polygon)
277+
static func getShapeInfo(source_global_trans : Transform2D, source_polygon : PoolVector2Array) -> Dictionary:
278+
var triangulation : Dictionary = triangulatePolygon(source_polygon, true, true)
279+
var centroid : Vector2 = getPolygonCentroid(triangulation.triangles, triangulation.area)
280+
var centered_shape : PoolVector2Array = translatePolygon(source_polygon, -centroid)
281+
return makeShapeInfo(centered_shape, centroid, source_global_trans.get_origin(), triangulation.area)# {"spawn_pos" : spawn_pos, "centered_shape" : centered_shape, "centroid" : centroid, "world_pos" : source_global_trans.get_origin()}
282+
283+
static func getShapeInfoSimple(source_global_trans : Transform2D, source_polygon : PoolVector2Array, triangulation : Dictionary) -> Dictionary:
284+
var centroid : Vector2 = getPolygonCentroid(triangulation.triangles, triangulation.area)
275285
var centered_shape : PoolVector2Array = translatePolygon(source_polygon, -centroid)
276-
var area : float = 0.0
277-
if calculate_area:
278-
area = getPolygonArea(centered_shape)
279-
return makeShapeInfo(centered_shape, centroid, source_global_trans.get_origin(), area)# {"spawn_pos" : spawn_pos, "centered_shape" : centered_shape, "centroid" : centroid, "world_pos" : source_global_trans.get_origin()}
286+
# print("Get shape info simple Poly: ", source_polygon, " centroid: ", centroid, "triangulation area: ", triangulation.area, " Centered Shape: ", centered_shape)
287+
# print("Triangulation: ", triangulation, " Centered Shape: ", centered_shape)
288+
return makeShapeInfo(centered_shape, centroid, source_global_trans.get_origin(), triangulation.area)
280289

281290
static func getShapeSpawnPos(parent_global_trans : Transform2D, centroid : Vector2, source_global_pos : Vector2) -> Vector2:
282291
var spawn_pos : Vector2 = toGlobal(parent_global_trans, centroid) + source_global_pos

0 commit comments

Comments
 (0)