public Vector3[] GenerateGraph(IGraphProperties graphProperties, out int[][] edges)
    {
        List <Vector3> nodes     = new List <Vector3>();
        List <int[]>   edgesList = new List <int[]>();

        RandomGraphProperties randomGraphProperties = graphProperties as RandomGraphProperties;;

        GenerateNodes(randomGraphProperties.Location, randomGraphProperties.Size, randomGraphProperties.NodesCount,
                      nodes);
        GenerateEdges(randomGraphProperties.NodesCount, randomGraphProperties.EdgesProbability, edgesList);

        edges = edgesList.ToArray();
        return(nodes.ToArray());
    }
    public Vector3[] GenerateGraph(IGraphProperties graphProperties, out int[][] edges)
    {
        List <Vector3> nodes     = new List <Vector3>();
        List <int[]>   edgesList = new List <int[]>();

        Vector3[]             lastNodesFloor        = null;
        Vector3[]             currentNodesFloor     = null;
        SpiralGraphProperties spiralGraphProperties = graphProperties as SpiralGraphProperties;

        float topY        = spiralGraphProperties.Location.y + spiralGraphProperties.Height;
        float floorHeight = spiralGraphProperties.Height / (spiralGraphProperties.FloorsCount - 1);

        for (int floorNo = 0; floorNo < spiralGraphProperties.FloorsCount; floorNo++)
        {
            float floorY        = spiralGraphProperties.Location.y + floorNo * floorHeight;
            float newConeHeight = topY - floorY;
            float floorRadius   = spiralGraphProperties.BaseRadius * newConeHeight / spiralGraphProperties.Height;

            if (floorNo > 0)
            {
                lastNodesFloor = new Vector3[currentNodesFloor.Length];
                currentNodesFloor.CopyTo(lastNodesFloor, 0);
            }

            Vector3 partSize    = new Vector3(floorRadius / 2, floorHeight, floorRadius / 2);
            Vector3 floorOrigin = new Vector3(spiralGraphProperties.Location.x, floorY, spiralGraphProperties.Location.z);

            currentNodesFloor = GraphGeneratorHelper.GenerateNodeLocationsOnCircle(floorOrigin, floorRadius,
                                                                                   spiralGraphProperties.FloorsNodesCounts[floorNo], spiralGraphProperties.RandomizationPercentage, partSize);
            nodes.AddRange(currentNodesFloor);

            edgesList.AddRange(GraphGeneratorHelper.GetEdgesInCircle(currentNodesFloor, nodes, true));

            if (floorNo > 0)
            {
                edgesList.Add(new[]
                {
                    nodes.IndexOf(lastNodesFloor[lastNodesFloor.Length - 1]),
                    nodes.IndexOf(currentNodesFloor[0])
                });
                edgesList.AddRange(GraphGeneratorHelper.GetEdgesBetweenTwoSetsAllToAll(lastNodesFloor, currentNodesFloor,
                                                                                       nodes, spiralGraphProperties.EdgesProbability));
            }
        }

        edges = edgesList.ToArray();
        return(nodes.ToArray());
    }
예제 #3
0
    public Vector3[] GenerateGraph(IGraphProperties graphProperties, out int[][] edges)
    {
        List <Vector3> nodes     = new List <Vector3>();
        List <int[]>   edgesList = new List <int[]>();

        CubicGraphProperties cubicGraphProperties = graphProperties as CubicGraphProperties;;

        Vector3[,,] nodesMesh =
            new Vector3[cubicGraphProperties.PartsCount, cubicGraphProperties.PartsCount,
                        cubicGraphProperties.PartsCount];

        Vector3 partSize = cubicGraphProperties.Size / (cubicGraphProperties.PartsCount - 1);

        GenerateNodes(cubicGraphProperties.Location, cubicGraphProperties.PartsCount,
                      cubicGraphProperties.RandomizationPercentage, partSize, nodesMesh, nodes);
        GenerateEdges(cubicGraphProperties.PartsCount, edgesList, nodes, nodesMesh);

        edges = edgesList.ToArray();
        return(nodes.ToArray());
    }
    public Vector3[] GenerateGraph(IGraphProperties graphProperties, out int[][] edges)
    {
        List <Vector3> nodes     = new List <Vector3>();
        List <int[]>   edgesList = new List <int[]>();

        Vector3[] lastNodesFloor    = null;
        Vector3[] currentNodesFloor = null;
        SphericGraphProperties sphericGraphProperties = graphProperties as SphericGraphProperties;

        float   radiusPart = sphericGraphProperties.Radius / sphericGraphProperties.FloorsCount;
        Vector3 partSize   = new Vector3(radiusPart / 2, radiusPart / 2, radiusPart / 2);

        for (int floorNo = 0; floorNo < sphericGraphProperties.FloorsCount; floorNo++)
        {
            float radiusFrom = sphericGraphProperties.Location.y + floorNo * radiusPart;
            float radiusTo   = sphericGraphProperties.Location.y + (floorNo + 1) * radiusPart;

            if (floorNo > 0)
            {
                lastNodesFloor = new Vector3[currentNodesFloor.Length];
                currentNodesFloor.CopyTo(lastNodesFloor, 0);
            }

            currentNodesFloor = GraphGeneratorHelper.GenerateNodeLocationsInSphereSlice(
                sphericGraphProperties.Location, radiusFrom, radiusTo, sphericGraphProperties.FloorsNodesCounts[floorNo],
                sphericGraphProperties.RandomizationPercentage, partSize);
            nodes.AddRange(currentNodesFloor);

            edgesList.AddRange(GraphGeneratorHelper.GetEdgesInCircle(currentNodesFloor, nodes));

            if (floorNo > 0)
            {
                edgesList.AddRange(GraphGeneratorHelper.GetEdgesBetweenTwoSetsAllToAll(lastNodesFloor, currentNodesFloor,
                                                                                       nodes, sphericGraphProperties.EdgesProbability, 2 * radiusPart));
            }
        }

        edges = edgesList.ToArray();
        return(nodes.ToArray());
    }
    public void Generate(GraphType graphType, IGraphProperties properties = null, int[][] powerDotLocations = null)
    {
        int[][]   edges          = null;
        Vector3[] nodesLocations = null;

        switch (graphType)
        {
        case GraphType.Conic:
        {
            ConicGraphProperties conicGraphProperties = (ConicGraphProperties)properties ?? new ConicGraphProperties
            {
                Location = transform.position,
                RandomizationPercentage = RandomizationPercentage,
                Height      = ConeHeight,
                FloorsCount = ConeFloorCount,
                BaseRadius  = ConeRadius
            };
            nodesLocations = GenerateNodeConicLocations(conicGraphProperties, out edges);
            break;
        }

        case GraphType.Cubic:
        {
            CubicGraphProperties cubicGraphProperties = (CubicGraphProperties)properties ?? new CubicGraphProperties
            {
                RandomizationPercentage = RandomizationPercentage,
                Location   = transform.position,
                PartsCount = CubePartsCount,
                Size       = CubeSize
            };
            nodesLocations = GenerateNodeCubicLocations(cubicGraphProperties, out edges);
            break;
        }

        case GraphType.Random:
        {
            RandomGraphProperties randomGraphProperties = (RandomGraphProperties)properties ?? new RandomGraphProperties
            {
                Location         = transform.position,
                NodesCount       = RandomNodesCount,
                EdgesProbability = RandomEdgesProbability,
                Size             = RandomCubeSize
            };
            nodesLocations = GenenerateNodeRandomLocations(randomGraphProperties, out edges);
            break;
        }

        case GraphType.Spheric:
        {
            SphericGraphProperties sphericGraphProperties = (SphericGraphProperties)properties ??
                                                            new SphericGraphProperties
            {
                RandomizationPercentage = RandomizationPercentage,
                Location         = transform.position,
                FloorsCount      = SphereFloorsCount,
                EdgesProbability = SphereEdgesProbability,
                Radius           = SphereRadius
            };
            nodesLocations = GenerateNodeSphericLocations(sphericGraphProperties, out edges);
            break;
        }

        case GraphType.Spiral:
        {
            SpiralGraphProperties spiralGraphProperties = (SpiralGraphProperties)properties ??
                                                          new SpiralGraphProperties
            {
                Location = transform.position,
                RandomizationPercentage = RandomizationPercentage,
                Height           = SpiralHeight,
                FloorsCount      = SpiralFloorCount,
                BaseRadius       = SpiralRadius,
                EdgesProbability = SpiralEdgesProbability
            };
            nodesLocations = GenerateNodeSpiralLocations(spiralGraphProperties, out edges);
            break;
        }
        }

        InitializeNodes(nodesLocations);
        InitializeEdges(this.Nodes, edges, powerDotLocations);
    }