package com.teasearch.animation.ingress.mu; import java.util.Arrays; import java.util.LinkedList; import com.teasearch.animation.ingress.portals.Portal; import com.teasearch.utils.GeomUtils; public class MUCalculator { public static double calculateMU(double areaPerMU, Portal[][] corners, Portal[] interior) { double area = 0; for (Portal[] p : corners) { area += GeomUtils.getArea(p[0].getPt(), p[1].getPt(), p[2].getPt()); } LinkedList<Portal[]> triangles = new LinkedList<>(); triangles.addAll(Arrays.asList(corners)); for (int i=0; i<interior.length; i++) { Portal splitter = interior[i]; // find which triangle it's splitting int which = -1; for (int j=0; which<0 && j<triangles.size(); j++) { Portal[] triangle = triangles.get(j); if (GeomUtils.pointInTriangle(splitter.getPt(), triangle[0].getPt(), triangle[1].getPt(), triangle[2].getPt())) { which = j; } } if (which < 0) throw new IllegalStateException("splitter " + i+" failed to split!"); // remove that triangle from the list Portal[] toSplit = triangles.get(which); area += GeomUtils.getArea(toSplit[0].getPt(), toSplit[1].getPt(), toSplit[2].getPt()); triangles.remove(which); // create animations // add new triangles to the list triangles.add(new Portal[] {splitter, toSplit[0], toSplit[1]}); triangles.add(new Portal[] {splitter, toSplit[1], toSplit[2]}); triangles.add(new Portal[] {splitter, toSplit[2], toSplit[0]}); } return area / areaPerMU; } }