Esempio n. 1
0
        public static TestResult RunTest(TestType testType)
        {
            const int repeat = 5;

            var spaces = new[]
            {
                new Space(1000, 1000),
                new Space(1200, 1200),
                new Space(1400, 1400),
                new Space(1600, 1600),
                new Space(1800, 1800),
                new Space(2000, 2000)
            };

            var watch = new Stopwatch();
            var testResult = new TestResult();

            foreach (var space in spaces)
            {
                space.RandomGenerate();

                var key = $"{space.HeightCount}x{space.WidthCount}";

                for (var i = 0; i < repeat; i++)
                {
                    watch.Start();

                    switch (testType)
                    {
                        case TestType.SingleThread:
                            space.NewGeneration();
                            break;
                        case TestType.MultiThread:
                            space.NewGenerationMultiThread();
                            break;
                        default:
                            throw new ArgumentOutOfRangeException(nameof(testType), testType, null);
                    }

                    watch.Stop();

                    testResult[key] = watch.ElapsedMilliseconds;

                    watch.Reset();
                }

                var eventArg = new IntermediateResult
                {
                    TestType = testType,
                    Min = testResult[key, GettingType.Min],
                    Max = testResult[key, GettingType.Max],
                    Size = key
                };

                NewGenerationDone?.Invoke(null, eventArg);
            }

            return testResult;
        }
        static internal async Task <ILookup <string, string> > BrowseDomainsAsync(BrowseDomainsOptions options,
                                                                                  Action <string, string> callback    = null,
                                                                                  CancellationToken cancellationToken = default(CancellationToken),
                                                                                  System.Net.NetworkInformation.NetworkInterface[] netInterfacesToSendRequestOn = null)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (netInterfacesToSendRequestOn != null)
            {
                throw new NotImplementedException($"iOS NSNetServiceBrowser/NSNetService does not support per-network interface requests");
            }

            var browseDomainProtocolList = BonjourBrowser.GetNSBonjourServices();

            ResolveOptions resolveOptions  = new ResolveOptions(browseDomainProtocolList);
            var            zeroconfResults = await ResolveAsync(resolveOptions, callback : null, cancellationToken, netInterfacesToSendRequestOn);

            List <IntermediateResult> resultsList = new List <IntermediateResult>();

            foreach (var host in zeroconfResults)
            {
                foreach (var service in host.Services)
                {
                    foreach (var ipAddr in host.IPAddresses)
                    {
                        IntermediateResult b = new IntermediateResult();
                        b.ServiceNameAndDomain = service.Key;
                        b.HostIPAndService     = $"{ipAddr}: {BonjourBrowser.GetServiceType(service.Value.Name, includeTcpUdpDelimiter: false)}";

                        resultsList.Add(b);

                        // Simpleminded callback implementation
                        if (callback != null)
                        {
                            callback(service.Key, ipAddr);
                        }
                    }
                }
            }

            ILookup <string, string> results = resultsList.ToLookup(k => k.ServiceNameAndDomain, h => h.HostIPAndService);

            return(results);
        }
Esempio n. 3
0
        public bool CalculatePenetrationDepth(ISimplexSolver simplexSolver,
            ConvexShape convexA, ConvexShape convexB,
            Matrix transformA, Matrix transformB,
            Vector3 v, out Vector3 pa, out Vector3 pb, IDebugDraw debugDraw)
        {
            pa = new Vector3();
            pb = new Vector3();
            //just take fixed number of orientation, and sample the penetration depth in that direction
            float minProj = 1e30f;
            Vector3 minNorm = new Vector3();
            Vector3 minA = new Vector3(), minB = new Vector3();
            Vector3 seperatingAxisInA, seperatingAxisInB;
            Vector3 pInA, qInB, pWorld, qWorld, w;

            Vector3[] supportVerticesABatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2];
            Vector3[] supportVerticesBBatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2];
            Vector3[] seperatingAxisInABatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2];
            Vector3[] seperatingAxisInBBatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2];

            int numSampleDirections = UnitSpherePointsCount;

            for (int i = 0; i < numSampleDirections; i++)
            {
                Vector3 norm = penetrationDirections[i];
                seperatingAxisInABatch[i] = Vector3.TransformNormal((-norm), transformA);
                seperatingAxisInBBatch[i] = Vector3.TransformNormal(norm, transformB);
            }

            {
                int numPDA = convexA.PreferredPenetrationDirectionsCount;
                if (numPDA != 0)
                {
                    for (int i = 0; i < numPDA; i++)
                    {
                        Vector3 norm;
                        convexA.GetPreferredPenetrationDirection(i, out norm);
                        norm = Vector3.TransformNormal(norm, transformA);
                        penetrationDirections[numSampleDirections] = norm;
                        seperatingAxisInABatch[numSampleDirections] = Vector3.TransformNormal((-norm), transformA);
                        seperatingAxisInBBatch[numSampleDirections] = Vector3.TransformNormal(norm, transformB);
                        numSampleDirections++;
                    }
                }
            }

            {
                int numPDB = convexB.PreferredPenetrationDirectionsCount;
                if (numPDB != 0)
                {
                    for (int i = 0; i < numPDB; i++)
                    {
                        Vector3 norm;
                        convexB.GetPreferredPenetrationDirection(i, out norm);
                        norm = Vector3.TransformNormal(norm, transformB);
                        penetrationDirections[numSampleDirections] = norm;
                        seperatingAxisInABatch[numSampleDirections] = Vector3.TransformNormal((-norm), transformA);
                        seperatingAxisInBBatch[numSampleDirections] = Vector3.TransformNormal(norm, transformB);
                        numSampleDirections++;
                    }
                }
            }

            convexA.BatchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInABatch, supportVerticesABatch); //, numSampleDirections);
            convexB.BatchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInBBatch, supportVerticesBBatch); //, numSampleDirections);

            for (int i = 0; i < numSampleDirections; i++)
            {
                Vector3 norm = penetrationDirections[i];
                seperatingAxisInA = seperatingAxisInABatch[i];
                seperatingAxisInB = seperatingAxisInBBatch[i];

                pInA = supportVerticesABatch[i];
                qInB = supportVerticesBBatch[i];

                pWorld = MathHelper.MatrixToVector(transformA, pInA);
                qWorld = MathHelper.MatrixToVector(transformB, qInB);
                w = qWorld - pWorld;
                float delta = Vector3.Dot(norm, w);
                //find smallest delta
                if (delta < minProj)
                {
                    minProj = delta;
                    minNorm = norm;
                    minA = pWorld;
                    minB = qWorld;
                }
            }

            //add the margins
            minA += minNorm * convexA.Margin;
            minB -= minNorm * convexB.Margin;
            //no penetration
            if (minProj < 0)
                return false;

            minProj += (convexA.Margin + convexB.Margin);

            GjkPairDetector gjkdet = new GjkPairDetector(convexA, convexB, simplexSolver, null);

            float offsetDist = minProj;
            Vector3 offset = minNorm * offsetDist;

            GjkPairDetector.ClosestPointInput input = new DiscreteCollisionDetectorInterface.ClosestPointInput();

            Vector3 newOrg = transformA.Translation + offset;

            Matrix displacedTrans = transformA;
            displacedTrans.Translation = newOrg;

            input.TransformA = displacedTrans;
            input.TransformB = transformB;
            input.MaximumDistanceSquared = 1e30f;//minProj;

            IntermediateResult res = new IntermediateResult();
            gjkdet.GetClosestPoints(input, res, debugDraw);

            float correctedMinNorm = minProj - res.Depth;

            //the penetration depth is over-estimated, relax it
            float penetration_relaxation = 1;
            minNorm *= penetration_relaxation;

            if (res.HasResult)
            {

                pa = res.PointInWorld - minNorm * correctedMinNorm;
                pb = res.PointInWorld;
            }

            return res.HasResult;
        }
        public bool CalculatePenetrationDepth(ISimplexSolver simplexSolver,
                                              ConvexShape convexA, ConvexShape convexB,
                                              Matrix transformA, Matrix transformB,
                                              Vector3 v, out Vector3 pa, out Vector3 pb, IDebugDraw debugDraw)
        {
            pa = new Vector3();
            pb = new Vector3();
            //just take fixed number of orientation, and sample the penetration depth in that direction
            float   minProj = 1e30f;
            Vector3 minNorm = new Vector3();
            Vector3 minA = new Vector3(), minB = new Vector3();
            Vector3 seperatingAxisInA, seperatingAxisInB;
            Vector3 pInA, qInB, pWorld, qWorld, w;

            Vector3[] supportVerticesABatch  = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2];
            Vector3[] supportVerticesBBatch  = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2];
            Vector3[] seperatingAxisInABatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2];
            Vector3[] seperatingAxisInBBatch = new Vector3[UnitSpherePointsCount + ConvexShape.MaxPreferredPenetrationDirections * 2];

            int numSampleDirections          = UnitSpherePointsCount;

            for (int i = 0; i < numSampleDirections; i++)
            {
                Vector3 norm = penetrationDirections[i];
                seperatingAxisInABatch[i] = Vector3.TransformNormal((-norm), transformA);
                seperatingAxisInBBatch[i] = Vector3.TransformNormal(norm, transformB);
            }

            {
                int numPDA = convexA.PreferredPenetrationDirectionsCount;
                if (numPDA != 0)
                {
                    for (int i = 0; i < numPDA; i++)
                    {
                        Vector3 norm;
                        convexA.GetPreferredPenetrationDirection(i, out norm);
                        norm = Vector3.TransformNormal(norm, transformA);
                        penetrationDirections[numSampleDirections]  = norm;
                        seperatingAxisInABatch[numSampleDirections] = Vector3.TransformNormal((-norm), transformA);
                        seperatingAxisInBBatch[numSampleDirections] = Vector3.TransformNormal(norm, transformB);
                        numSampleDirections++;
                    }
                }
            }

            {
                int numPDB = convexB.PreferredPenetrationDirectionsCount;
                if (numPDB != 0)
                {
                    for (int i = 0; i < numPDB; i++)
                    {
                        Vector3 norm;
                        convexB.GetPreferredPenetrationDirection(i, out norm);
                        norm = Vector3.TransformNormal(norm, transformB);
                        penetrationDirections[numSampleDirections]  = norm;
                        seperatingAxisInABatch[numSampleDirections] = Vector3.TransformNormal((-norm), transformA);
                        seperatingAxisInBBatch[numSampleDirections] = Vector3.TransformNormal(norm, transformB);
                        numSampleDirections++;
                    }
                }
            }

            convexA.BatchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInABatch, supportVerticesABatch);             //, numSampleDirections);
            convexB.BatchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInBBatch, supportVerticesBBatch);             //, numSampleDirections);

            for (int i = 0; i < numSampleDirections; i++)
            {
                Vector3 norm = penetrationDirections[i];
                seperatingAxisInA = seperatingAxisInABatch[i];
                seperatingAxisInB = seperatingAxisInBBatch[i];

                pInA = supportVerticesABatch[i];
                qInB = supportVerticesBBatch[i];

                pWorld = MathHelper.MatrixToVector(transformA, pInA);
                qWorld = MathHelper.MatrixToVector(transformB, qInB);
                w      = qWorld - pWorld;
                float delta = Vector3.Dot(norm, w);
                //find smallest delta
                if (delta < minProj)
                {
                    minProj = delta;
                    minNorm = norm;
                    minA    = pWorld;
                    minB    = qWorld;
                }
            }

            //add the margins
            minA += minNorm * convexA.Margin;
            minB -= minNorm * convexB.Margin;
            //no penetration
            if (minProj < 0)
            {
                return(false);
            }

            minProj += (convexA.Margin + convexB.Margin);

            GjkPairDetector gjkdet = new GjkPairDetector(convexA, convexB, simplexSolver, null);

            float   offsetDist = minProj;
            Vector3 offset     = minNorm * offsetDist;

            GjkPairDetector.ClosestPointInput input = new DiscreteCollisionDetectorInterface.ClosestPointInput();

            Vector3 newOrg = transformA.Translation + offset;

            Matrix displacedTrans = transformA;

            displacedTrans.Translation = newOrg;

            input.TransformA             = displacedTrans;
            input.TransformB             = transformB;
            input.MaximumDistanceSquared = 1e30f;            //minProj;

            IntermediateResult res = new IntermediateResult();

            gjkdet.GetClosestPoints(input, res, debugDraw);

            float correctedMinNorm = minProj - res.Depth;

            //the penetration depth is over-estimated, relax it
            float penetration_relaxation = 1;

            minNorm *= penetration_relaxation;

            if (res.HasResult)
            {
                pa = res.PointInWorld - minNorm * correctedMinNorm;
                pb = res.PointInWorld;
            }

            return(res.HasResult);
        }