@@ -79,12 +79,18 @@ private int calculateRegionSides(Set<GardenPlot> gardenPlots) {
7979 // - En el resto de casos, no hay ángulos.
8080
8181 int angles = 0 ;
82+ int externalAngles = 0 ;
83+ int internalAngles = 0 ;
84+ int internalConvexAngles = 0 ;
8285
8386 for (GardenPlot gardenPlot : gardenPlots ) {
84- angles += sumExternalAngles (gardenPlot );
85- angles += sumInternalAngles (gardenPlot ); // TODO descomenta esto para resultado final
87+ externalAngles += sumExternalAngles (gardenPlot );
88+ internalAngles += sumInternalAngles (gardenPlot ); // TODO descomenta esto para resultado final
89+ internalConvexAngles += sumInternalConvexAngles (gardenPlot );
8690 }
8791
92+ angles = externalAngles + internalAngles + internalConvexAngles ;
93+
8894 // https://www.sciencing.com/how-to-find-the-number-of-sides-of-a-polygon-12751688/
8995 return (angles / 180 ) + 2 ;
9096 }
@@ -220,6 +226,121 @@ private boolean hasDownRightInternalAngle(GardenPlot gardenPlot) {
220226 map [downPos .getY ()][downPos .getX ()].getRegionId () == gardenPlot .getRegionId ());
221227 }
222228
229+ private int sumInternalConvexAngles (GardenPlot gardenPlot ) {
230+ int angles = 0 ;
231+
232+ if (hasUpLeftInternalConvexAngle (gardenPlot )) {
233+ angles -= 90 ;
234+ }
235+
236+ if (hasUpRightInternalConvexAngle (gardenPlot )) {
237+ angles -= 90 ;
238+ }
239+
240+ if (hasDownLeftInternalConvexAngle (gardenPlot )) {
241+ angles -= 90 ;
242+ }
243+
244+ if (hasDownRightInternalConvexAngle (gardenPlot )) {
245+ angles -= 90 ;
246+ }
247+
248+ return angles ;
249+
250+ }
251+
252+ private boolean hasUpLeftInternalConvexAngle (GardenPlot gardenPlot ) {
253+
254+ // Solo puede haber ángulos convexos en el interior del mapa
255+ if (isInBorder (gardenPlot .getPosition ())) {
256+ return false ;
257+ }
258+
259+ // Get adjacent up and left
260+ Vector2 upPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .down ());
261+ if (map [upPos .getY ()][upPos .getX ()].getRegionId () == gardenPlot .getRegionId ()) {
262+ return false ;
263+ }
264+
265+ Vector2 leftPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .left ());
266+ if (map [leftPos .getY ()][leftPos .getX ()].getRegionId () == gardenPlot .getRegionId ()) {
267+ return false ;
268+ }
269+
270+ Vector2 diagonalPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .downLeft ());
271+ return map [diagonalPos .getY ()][diagonalPos .getX ()].getRegionId () == gardenPlot .getRegionId ();
272+ }
273+
274+ private boolean hasUpRightInternalConvexAngle (GardenPlot gardenPlot ) {
275+
276+ // Solo puede haber ángulos convexos en el interior del mapa
277+ if (isInBorder (gardenPlot .getPosition ())) {
278+ return false ;
279+ }
280+
281+ // Get adjacent up and left
282+ Vector2 upPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .down ());
283+ if (map [upPos .getY ()][upPos .getX ()].getRegionId () == gardenPlot .getRegionId ()) {
284+ return false ;
285+ }
286+
287+ Vector2 rightPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .right ());
288+ if (map [rightPos .getY ()][rightPos .getX ()].getRegionId () == gardenPlot .getRegionId ()) {
289+ return false ;
290+ }
291+
292+ Vector2 diagonalPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .downRight ());
293+ return map [diagonalPos .getY ()][diagonalPos .getX ()].getRegionId () == gardenPlot .getRegionId ();
294+ }
295+
296+ private boolean hasDownLeftInternalConvexAngle (GardenPlot gardenPlot ) {
297+
298+ // Solo puede haber ángulos convexos en el interior del mapa
299+ if (isInBorder (gardenPlot .getPosition ())) {
300+ return false ;
301+ }
302+
303+ // Get adjacent up and left
304+ Vector2 downPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .up ());
305+ if (map [downPos .getY ()][downPos .getX ()].getRegionId () == gardenPlot .getRegionId ()) {
306+ return false ;
307+ }
308+
309+ Vector2 leftPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .left ());
310+ if (map [leftPos .getY ()][leftPos .getX ()].getRegionId () == gardenPlot .getRegionId ()) {
311+ return false ;
312+ }
313+
314+ Vector2 diagonalPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .upLeft ());
315+ return map [diagonalPos .getY ()][diagonalPos .getX ()].getRegionId () == gardenPlot .getRegionId ();
316+ }
317+
318+ private boolean hasDownRightInternalConvexAngle (GardenPlot gardenPlot ) {
319+
320+ // Solo puede haber ángulos convexos en el interior del mapa
321+ if (isInBorder (gardenPlot .getPosition ())) {
322+ return false ;
323+ }
324+
325+ // Get adjacent up and left
326+ Vector2 downPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .up ());
327+ if (map [downPos .getY ()][downPos .getX ()].getRegionId () == gardenPlot .getRegionId ()) {
328+ return false ;
329+ }
330+
331+ Vector2 rightPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .right ());
332+ if (map [rightPos .getY ()][rightPos .getX ()].getRegionId () == gardenPlot .getRegionId ()) {
333+ return false ;
334+ }
335+
336+ Vector2 diagonalPos = Vector2 .transform (gardenPlot .getPosition (), Vector2 .upRight ());
337+ return map [diagonalPos .getY ()][diagonalPos .getX ()].getRegionId () == gardenPlot .getRegionId ();
338+ }
339+
340+ private boolean isInBorder (Vector2 pos ) {
341+ return (pos .getY () == 0 || pos .getY () == rows - 1 || pos .getX () == 0 || pos .getX () == cols - 1 );
342+ }
343+
223344 private int sumExternalAngles (GardenPlot gardenPlot ) {
224345
225346 int angles = 0 ;
0 commit comments