示例#1
0
    private MiniCentroid GetClosestCentroid(MiniCentroid c)
    {
        float        closest         = 10000;
        MiniCentroid closestCentroid = first;

        for (int i = 0; i < miniCentroid.Count; i++)
        {
            MiniCentroid toCheck = miniCentroid[i];
            if (toCheck == c)
            {
                continue;
            }
            if (InMapped(toCheck))
            {
                continue;
            }
            float distance = Vector3.Distance(c.position, toCheck.position);
            if (distance < closest)
            {
                closest         = distance;
                closestCentroid = toCheck;
            }
        }

        return(closestCentroid);
    }
示例#2
0
    public void FilterMiniCentroids()
    {
        for (int i = 0; i < points.Count; i++)
        {
            points[i].FilterPoint();
        }

        for (int i = 0; i < miniCentroid.Count; i++)
        {
            MiniCentroid current = miniCentroid[i];
            MiniCentroid closest = GetClosestMiniCentroid(current);
            if (closest == null)
            {
                continue;
            }
            float distance = Vector3.Distance(current.position, closest.position);
            if (distance > .55f)
            {
                GameObject obj = current.transform.gameObject;

                for (int ia = 0; ia < current.points.Count; ia++)
                {
                    current.points[ia].Hide();
                }

                miniCentroid[i].Refresh();

                miniCentroid.Remove(current);
                Destroy(obj);
            }
        }
    }
示例#3
0
    private bool InMapped(MiniCentroid c)
    {
        for (int i = 0; i < mapped.Count; i++)
        {
            if (mapped[i] == c)
            {
                return(true);
            }
        }

        return(false);
    }
示例#4
0
 private void CreateMiniCentroid()
 {
     for (int i = 0; i < miniCentroidCount; i++)
     {
         GameObject clone = Instantiate(cluster.miniCentroid) as GameObject;
         clone.transform.SetParent(transform);
         clone.transform.position = transform.position;
         MiniCentroid mini = clone.GetComponent <MiniCentroid>();
         mini.SetMainCentroid(this);
         miniCentroid.Add(mini);
     }
     path = new PathGeneration(miniCentroid);
 }
示例#5
0
    public void Merge(MiniCentroid mini)
    {
        if (this == mini)
        {
            return;
        }

        for (int i = 0; i < mini.points.Count; i++)
        {
            points.Add(mini.points[i]);
            //mini.points[i].Hide();
        }

        mainCentroid.miniCentroid.Remove(mini);
        Destroy(mini.transform.gameObject);
    }
示例#6
0
    private MiniCentroid GetStarterCentroid()
    {
        MiniCentroid c = null;
        float        z = 10000;

        for (int i = 0; i < miniCentroid.Count; i++)
        {
            MiniCentroid toCheck = miniCentroid[i];
            if (toCheck.position.z < z)
            {
                z = toCheck.position.z;
                c = toCheck;
            }
        }

        if (c == null)
        {
            c = miniCentroid[Random.Range(0, miniCentroid.Count)];
        }

        return(c);
    }
示例#7
0
    public MiniCentroid GetClosestMiniCentroid(ClusterPoint cp)
    {
        MiniCentroid c;

        closest = null;
        if (cp.miniCentroid == null)
        {
            cp.SetMiniCentroid(this);
        }
        distanceMagnitude = Vector3.SqrMagnitude(cp.position - cp.miniCentroid.position);
        for (int i = 0; i < mainCentroid.miniCentroid.Count; i++)
        {
            c         = mainCentroid.miniCentroid[i];
            magnitude = Vector3.SqrMagnitude(cp.position - c.position);
            if (magnitude < distanceMagnitude)
            {
                closest           = c;
                distanceMagnitude = magnitude;
            }
        }

        return(closest);
    }
示例#8
0
    public void GenerateMesh()
    {
        List <Vector2> points = new List <Vector2>();

        for (int i = 0; i < centroids.Count; i++)
        {
            Centroid currentCentroid = centroids[i];
            for (int j = 0; j < currentCentroid.miniCentroid.Count; j++)
            {
                MiniCentroid mini = currentCentroid.miniCentroid[j];

                List <Vector2> active = mini.GetActivePoints();

                for (int k = 0; k < active.Count; k++)
                {
                    points.Add(active[k]);
                }
            }
        }


        FindObjectOfType <Navigation.Grid>().DisplayNavmesh(points);
    }
示例#9
0
    public void CalculatePoint()
    {
        ClusterPoint cp;

        for (int i = 0; i < points.Count; i++)
        {
            cp = points[i];

            closest = GetClosestMiniCentroid(cp);

            if (closest == null)
            {
                continue;
            }

            cp.miniCentroid.points.Remove(cp);

            closest.points.Add(cp);

            cp.SetMiniCentroid(closest);
        }

        CalculateCenter();
    }
示例#10
0
    public void GeneratePath(Color c)
    {
        for (int i = 0; i < miniCentroid.Count; i++)
        {
            if (next == null)
            {
                next  = GetStarterCentroid();
                first = next;
            }

            MiniCentroid closest = GetClosestCentroid(next);

            if (!InMapped(closest))
            {
                DrawPath(closest.position, c);
                mapped.Add(next);
                next = closest;
            }
            else
            {
                DrawPath(first.position, c);
            }
        }
    }
示例#11
0
 public void SetMiniCentroid(MiniCentroid c)
 {
     this.miniCentroid = c;
     //sr.color = c.random;
     distanceFromMini = Vector3.Distance(position, miniCentroid.position);
 }