示例#1
0
        public static List <Trajectory> Truncate(this Trajectory trj, Envelope box)
        {
            List <Trajectory> trjs   = new List <Trajectory>();
            Trajectory        subTrj = new Trajectory();
            int minCount             = 128;

            for (int i = 0; i < trj.Count; ++i)
            {
                if (box.Contains(trj[i].point.ToCoordinate()))
                {
                    subTrj.Add(trj[i]);
                }
                else
                {
                    if (subTrj.Count > minCount)
                    {
                        trjs.Add(subTrj);
                    }
                    subTrj = new Trajectory();
                }
            }
            if (subTrj.Count > minCount)
            {
                trjs.Add(subTrj);
            }
            return(trjs);
        }
示例#2
0
    private void CalculateTrajectory()
    {
        Trajectory.Clear();
        Ray        ray = new Ray(transform.position, ballRb.velocity.normalized);
        RaycastHit hit;
        bool       endOfCourt = false;
        int        sentinel   = 1000;

        while (!endOfCourt && sentinel > 0)
        {
            if (Physics.Raycast(ray, out hit))
            {
                if (hit.collider.gameObject.tag == "Wall")
                {
                    Trajectory.Add(hit.point);
                    var nextDir = Vector3.Reflect(ray.direction, hit.normal);
                    ray = new Ray(hit.point, nextDir);
                }
                else if (hit.collider.gameObject.tag == "Goal")
                {
                    Trajectory.Add(hit.point);
                    endOfCourt = true;
                }
                else
                {
                    Trajectory.Add(hit.point); // only other object is paddle, so we count as end
                    endOfCourt = true;
                }
            }

            sentinel--;
        }
    }
        private Trajectory SimulateTrajectory(Vector3 force, Vector3 torque, SimulationBaseData simData, float targetHeight)
        {
            var simObject  = simData.SimObject;
            var rigidBody  = simData.SimRigidBody;
            var trajectory = new Trajectory();

            rigidBody.velocity        = simData.OriginalRigidBody.velocity;
            rigidBody.angularVelocity = simData.OriginalRigidBody.angularVelocity;
            rigidBody.useGravity      = true;
            rigidBody.AddForce(force);
            rigidBody.AddTorque(torque);

            for (int i = 0; i <= DEFAULT_MAX_ITERATIONS; i++)
            {
                _simulationPhysicsScene.Simulate(Time.fixedDeltaTime);
                var position       = simObject.transform.position;
                var goingDownwards = rigidBody.velocity.y < 0;
                trajectory.Add(position);
                if (goingDownwards && position.y <= targetHeight)
                {
                    return(trajectory);
                }
            }
            return(trajectory);
        }
示例#4
0
文件: Sample.cs 项目: ISUE/Machete
 public void AddTrajectory(List <Vector> trajectory)
 {
     for (int i = 0; i < trajectory.Count; i++)
     {
         Trajectory.Add(trajectory[i].Clone() as Vector);
     }
 }
示例#5
0
        public Trajectory Compress()
        {
            Trajectory refinedTrj = new Trajectory();
            int        trjSize    = trj.Count;
            int        i          = 0;

            while (i < trjSize - 1)
            {
                refinedTrj.Add(trj[i]);
                int j = i + 1;
                for (; j < trjSize; ++j)
                {
                    if (!canApproximate(i, j))
                    {
                        break;
                    }
                }
                i = j - 1;
            }
            refinedTrj.Add(trj[trjSize - 1]);
            return(refinedTrj);
        }
示例#6
0
    // Update is called once per frame
    void Update()
    {
        var diceRoll = Random.Range((float)0.0, (float)1.0);

        foreach (var vehicle in GameObject.FindGameObjectsWithTag("vehicle"))
        {
            var vehiclePosition = vehicle.transform.position;
            var totalDistance   = Vector3.Distance(vehiclePosition, transform.position);
            if (totalDistance < MinimumSpawnDistance) //If there's a vehicle within 5 units of this spawn point, don't spawn
            {
                return;
            }
        }

        if (diceRoll < Probability)
        {
            var newcar = Instantiate(GameObject.Find("CarPrototype"), transform.position, transform.rotation);
            newcar.name = "car";
            newcar.tag  = "vehicle";
            var navigation = newcar.GetComponentInChildren <TargetNavigation>();

            for (var i = 0; i < this.transform.root.childCount; i++) //Add exit trajectories under this approach
            {
                if (this.transform.root.GetChild(i).CompareTag("trajectory"))
                {
                    var t     = new Trajectory();
                    var ti    = this.transform.root.GetChild(i).GetComponent <TrajectoryInfo>();
                    var child = this.transform.root.GetChild(i);
                    for (var j = 0; j < child.transform.childCount; j++)
                    {
                        var tf = child.GetChild(j);
                        t.Add(tf);
                    }
                    t.Road = ti.Road;
                    t.Turn = ti.Type;
                    navigation.Exits.Add(t);
                }
            }

            if (navigation.Exits.Count == 0)
            {
                Console.WriteLine("This should not happen.");
            }

            navigation.RandomizeTarget();
            newcar.GetComponentInChildren <TargetNavigation>().enabled = true;
            newcar.GetComponentInChildren <CarMovement>().enabled      = true;
        }
    }
        public void Calculate(AlgorithmType t)
        {
            InitializeProcessToRun(t);
            Debug.Assert(processToRun != null);
            AbstractNetworkContainer containerToChange = (AbstractNetworkContainer)container.Clone();

            Double timeStep = 0;
            Double currentTracingStep = tracingStepIncrement, currentActiveNodesCount = containerToChange.GetActiveNodesCount();

            Trajectory.Add(timeStep, currentActiveNodesCount / containerToChange.Size);
            if (visualMode)
            {
                Byte[] bits = new Byte[containerToChange.GetActiveStatuses().Length + 1];
                containerToChange.GetActiveStatuses().CopyTo(bits, 0);
                BitArray arr = new BitArray(bits);
                ActivesInformation.Add(arr);
            }

            while (timeStep <= stepCount && currentActiveNodesCount != 0)
            {
                processToRun(containerToChange);
                currentActiveNodesCount = containerToChange.GetActiveNodesCount();
                Trajectory.Add(++timeStep, currentActiveNodesCount / containerToChange.Size);
                if (visualMode)
                {
                    Byte[] bits = new Byte[containerToChange.GetActiveStatuses().Length + 1];
                    containerToChange.GetActiveStatuses().CopyTo(bits, 0);
                    BitArray arr = new BitArray(bits);
                    ActivesInformation.Add(arr);
                }

                network.UpdateStatus(NetworkStatus.StepCompleted);

                // TODO closed Trace

                /*if (TraceCurrentStep(timeStep, currentTracingStep, "ActivationAlgorithm_1"))
                 * {
                 *  currentTracingStep += TracingStepIncrement;
                 *  network.UpdateStatus(NetworkStatus.StepCompleted);
                 * }*/
            }
            Debug.Assert(timeStep > stepCount || !containerToChange.DoesActiveNodeExist());
        }
示例#8
0
        public Trajectory Decompress(VCompressedTrj ctrj)
        {
            int size = ctrj.Items.Count;

            if (size <= 0)
            {
                return(null);
            }
            Trajectory trj = new Trajectory();

            // Add the first reference point
            for (int i = 0; i < size; ++i)
            {
                var    item = ctrj.Items[i];
                double dist = item.RefPoint.distance;    // distance from the start point the edge to the current point
                long   t    = item.RefPoint.t;
                // add the reference point first
                trj.Add(new MotionVector(item.RefPoint.Point, item.RefPoint.t));
                Edge lastEdge = item.RefPoint.e;
                // Calculate the position of each point
                for (int j = 0; j < item.Points.Count; ++j)
                {
                    var      cMV           = item.Points[j];
                    double   totalDistance = cMV.si * cMV.v * _binSize; // the distance covered during the interval
                    GeoPoint p             = GeoPoint.INVALID;
                    t += cMV.si;
                    if (cMV.rid == lastEdge.ID)
                    {
                        dist += totalDistance;
                        p     = lastEdge.Predict(lastEdge.Start.Point, dist);
                    }
                    else
                    {
                        Edge curEdge = _g.Edges[cMV.rid];
                        dist = totalDistance - (lastEdge.Length - dist);  // minus the distance left in the previous road
                        if (lastEdge.End == curEdge.Start)
                        {
                            p = curEdge.Predict(curEdge.Start.Point, dist);
                        }
                        else
                        {
                            var path = _g.FindPath(lastEdge.End, curEdge.Start);
                            if (path != null)
                            {
                                foreach (var e in path)
                                {
                                    dist -= e.Length;
                                }
                                p = curEdge.Predict(curEdge.Start.Point, dist);
                            }
                            else
                            {
                                Debug.Assert(false);
                            }
                        }
                        lastEdge = curEdge;
                    }
                    trj.Add(new MotionVector(p, t));
                }
            }
            return(trj);
        }
示例#9
0
        public Trajectory GradientDescent()
        {
            var parameters = this.Parameters;

            if (function == null || derivation == null || parameters == null)
            {
                throw new OperationCanceledException("Неможливо розпочати роботу. Не всі параметри вказано");
            }

            var    curPoint     = parameters.StartPoint;
            var    curBeta      = parameters.Beta;
            var    staticBeta   = curBeta;
            double curAlpha     = 0;
            bool   pointChanged = false;

            Arguments antiGrad           = derivation.GetAntiGradient(curPoint);
            double    functionInCurPoint = function.Calculate(curPoint);
            double    antiGradModule     = antiGrad.Pow(2).GetSumm();
            var       allPoints          = new Trajectory();

            allPoints.Add(curPoint);
            for (; ;)
            {
                if (pointChanged)
                {
                    antiGrad           = derivation.GetAntiGradient(curPoint);
                    functionInCurPoint = function.Calculate(curPoint);
                    antiGradModule     = antiGrad.Pow(2).GetSumm();
                }
                Arguments nextPoint = curPoint + (antiGrad * curBeta);

                double functionInNextPoint = function.Calculate(nextPoint);

                if (!IsValidValue(antiGradModule))
                {
                    return(allPoints);
                }

                //F(Xk)-F(xk=B*antigrad(xk))>=epsilon|antigrad(xk)|^2
                double toTest     = antiGradModule * (curBeta * parameters.Epsilon);
                double toTestLeft = functionInCurPoint - functionInNextPoint;
                if (toTestLeft >= toTest)
                {
                    //add point it is normal
                    allPoints.Add(nextPoint);
                    double exitValue = (nextPoint - curPoint).GetModule();
                    if (exitValue < parameters.AccuracyEpsilon)
                    {
                        return(allPoints); //exit
                    }
                    else
                    {
                        curPoint = nextPoint;
                        // Increase step
                        Arguments antiGradNew = derivation.GetAntiGradient(curPoint);
                        antiGrad = antiGradNew;
                        bool      calculated    = false;
                        Arguments newValue      = null;
                        double    funcResultNew = 0;
                        Arguments oldValue      = null;
                        double    funcResultOld = 0;
                        for (; ;)
                        {
                            if (calculated)
                            {
                                oldValue      = newValue;
                                funcResultOld = funcResultNew;
                            }
                            else
                            {
                                oldValue      = curPoint + (antiGradNew * curBeta);
                                funcResultOld = function.Calculate(oldValue);
                            }

                            var nextInfinity = Double.IsInfinity(curBeta * parameters.M);
                            if (!nextInfinity)
                            {
                                curBeta = curBeta * parameters.M;
                                // Step is too big.
                                newValue      = curPoint + (antiGradNew * curBeta);
                                funcResultNew = function.Calculate(newValue);
                            }
                            calculated = true;

                            if (nextInfinity || funcResultOld <= funcResultNew)
                            {
                                curBeta      = curBeta / parameters.M;
                                staticBeta   = curBeta;
                                pointChanged = true;
                                curPoint     = curPoint + (antiGrad * curBeta);
                                curAlpha     = 0;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    pointChanged = false;

                    if (curAlpha == 0)
                    {
                        curAlpha = parameters.Alpha;
                    }
                    else
                    {
                        curAlpha = curAlpha * curAlpha;
                    }

                    curBeta = staticBeta * curAlpha;
                }
            }
        }