public List <List <Point> > FindConfigurationThatBalancesCentrifuge(int numSlots, int numSlotsFilled) { if (numSlotsFilled == 0) { return(new List <List <Point> > { new List <Point>() }); } var circle = new Circle(new Point(0, 0), 1); var positionsAroundCircle = circle.GenerateNPointsEvenlyAroundCircle( numSlots, new Angle(0, MeasurementType.Radians)).ToArray(); var successfulPositions = new List <List <Point> >(); var numConfigurations = Math.Pow(2, numSlots); var configurations = Enumerable.Range(0, (int)numConfigurations) .Select(id => Convert.ToString(id, 2).PadLeft(numSlots, '0').ToCharArray().Select(a => a - '0').ToArray()).ToList(); var configurationsContainingCorrectNumSlotsFilled = configurations.Where(c => c.Sum() == numSlotsFilled).ToList(); foreach (var configuration in configurationsContainingCorrectNumSlotsFilled) { var filledPositionsInCentrifuge = positionsAroundCircle.Where((point, i) => configuration[i] == 1).ToList(); var centroid = geometryUtilities.CalculateCenterOfMass(filledPositionsInCentrifuge); if (Math.Abs(centroid.X) < this.Epsilon && Math.Abs(centroid.Y) < this.Epsilon) { successfulPositions.Add(filledPositionsInCentrifuge); } } return(successfulPositions); }
public void TestCenterOfMass(int testCaseNum, double expectedCenterOfMassX, double expectedCenterOfMassY) { GeometryUtilities utilities = new GeometryUtilities(); var actualCenterOfMass = utilities.CalculateCenterOfMass(PointsForCenterOfMassDictionary[testCaseNum]); Assert.LessOrEqual(Math.Abs(expectedCenterOfMassX - actualCenterOfMass.X), Epsilon); Assert.LessOrEqual(Math.Abs(expectedCenterOfMassY - actualCenterOfMass.Y), Epsilon); }