Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }