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()); }
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); }