Beispiel #1
0
    public Vector3 GetNewPos(PolyAgent me)
    {
        Vector3 v1 = Cohesion(me);
        Vector3 v2 = Separation(me);

        return(v1 + v2);
    }
Beispiel #2
0
    public KeyValuePair <PolyAgent, Vector3> NextAgentAndCustomer(List <PolyAgent> agents)
    {
        if (customers.Count == 0)
        {
            throw new UnassignedReferenceException("customers list is empty");
        }

        Vector3   ret          = Vector3.zero;
        float     minCost      = -1;
        int       j            = -1;
        PolyAgent closestAgent = null;

        foreach (PolyAgent agent in agents)
        {
            for (int i = 0; i < customers.Count; i++)
            {
                float cost = Dist(customers[i], agent);
                if (minCost == -1 || cost < minCost)
                {
                    minCost      = cost;
                    j            = i;
                    ret          = customers[i];
                    closestAgent = agent;
                }
            }
        }

        customers.RemoveAt(j);
        return(new KeyValuePair <PolyAgent, Vector3> (closestAgent, ret));
    }
Beispiel #3
0
    public void SetPath(List <Vector3> path, PolyAgent agent, List <Line> lines)
    {
        this.path  = path;
        this.agent = agent;

        collision = new PolyCollision(lines);
    }
Beispiel #4
0
 public LeaderFollower(string agentId, Vector3 agentPos,
                       LeaderFollower parent, List <Vector3> wp = null)
 {
     agent = new PolyAgent(agentId, agentPos, Vector3.zero, 5, modelType);
     agent.agent.renderer.material.color = Color.black;
     leaderWP = wp;
     children = new List <LeaderFollower>();
     children.Add(new LeaderFollower());
     children.Add(new LeaderFollower());
     this.parent = parent;
 }
Beispiel #5
0
    private float Dist(Vector3 customer, PolyAgent agent)
    {
        float first = Mathf.Abs(customer.x - agent.agent.transform.position.x)
                      + Mathf.Abs(customer.z - agent.agent.transform.position.z);
        float second = Mathf.Abs(agent.end.x - customer.x)
                       + Mathf.Abs(agent.end.z - customer.z);

        if (customers.Count / size > 0.5)
        {
            return(first);
        }
        return(first + second);
    }
Beispiel #6
0
    Vector3 Cohesion(PolyAgent me)
    {
        Vector3 avg = me.agent.transform.position;

        foreach (PolyAgent agent in agents)
        {
            if (agent != me)
            {
                avg = avg + agent.agent.transform.position;
            }
        }
        avg = avg / (agents.Count - 2);
        return(avg - me.agent.transform.position);
    }
Beispiel #7
0
    Vector3 Separation(PolyAgent me)
    {
        Vector3 c = Vector3.zero;

        foreach (PolyAgent agent in agents)
        {
            if (agent != me)
            {
                if (Vector3.Distance(agent.agent.transform.position,
                                     me.agent.transform.position) < sepDist)
                {
                    c = c - (agent.agent.transform.position - me.agent.transform.position);
                }
            }
        }
        return(c * 5);
    }
Beispiel #8
0
 Vector3 Tendency(PolyAgent me, Vector3 to)
 {
     return((to - me.agent.transform.position) / 1);
 }