Пример #1
0
		/// <summary>
		/// Builds a new empty directed graph with default vertex and edge
		/// provider.
		/// </summary>
		/// <remarks>
		/// </remarks>
		public AdjacencyGraph()
		{
			this.vertexProvider = new QuickGraph.Providers.VertexProvider();
			this.edgeProvider = new QuickGraph.Providers.EdgeProvider();
			this.allowParallelEdges = true;
			this.vertexOutEdges = new VertexEdgesDictionary();
		}
Пример #2
0
 /// <summary>
 /// Builds a new empty directed graph with default vertex and edge
 /// provider.
 /// </summary>
 /// <param name="allowParallelEdges">true if parallel edges are allowed</param>
 public PetriGraph(bool allowParallelEdges)
 {
     this.vertexProvider = new QuickGraph.Providers.VertexProvider();
     this.edgeProvider = new QuickGraph.Providers.EdgeProvider();
     this.allowParallelEdges = allowParallelEdges;
     this.vertexOutEdges = new VertexEdgesDictionary();
 }
Пример #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="graphType"></param>
        /// <param name="vertexProviderType"></param>
        /// <param name="edgeProviderType"></param>
        /// <param name="directed"></param>
        /// <param name="allowParallelEdges"></param>
        /// <returns></returns>
        protected ISerializableVertexAndEdgeListGraph CreateGraph(
            Type graphType,
            Type vertexProviderType,
            Type edgeProviderType,
            bool directed,
            bool allowParallelEdges
            )
        {
            // create providers
            IVertexProvider vp =
                (IVertexProvider)vertexProviderType.GetConstructor(Type.EmptyTypes).Invoke(null);
            IEdgeProvider ep =
                (IEdgeProvider)edgeProviderType.GetConstructor(Type.EmptyTypes).Invoke(null);

            // create graph
            Type[] gts = new Type[3];
            gts[0] = typeof(IVertexProvider);
            gts[1] = typeof(IEdgeProvider);
            gts[2] = typeof(bool);

            Object[] gps = new Object[3];
            gps[0] = vp;
            gps[1] = ep;
            gps[2] = allowParallelEdges;
            return((ISerializableVertexAndEdgeListGraph)graphType.GetConstructor(gts).Invoke(gps));
        }
Пример #4
0
 /// <summary>
 /// Builds a new empty directed graph with default vertex and edge
 /// provider.
 /// </summary>
 /// <param name="allowParallelEdges">true if parallel edges are allowed</param>
 public PetriGraph(bool allowParallelEdges)
 {
     this.vertexProvider     = new QuickGraph.Providers.VertexProvider();
     this.edgeProvider       = new QuickGraph.Providers.EdgeProvider();
     this.allowParallelEdges = allowParallelEdges;
     this.vertexOutEdges     = new VertexEdgesDictionary();
 }
Пример #5
0
 /// <summary>
 /// Builds a new empty directed graph with default vertex and edge
 /// provider.
 /// </summary>
 /// <remarks>
 /// </remarks>
 public AdjacencyGraph()
 {
     this.vertexProvider     = new QuickGraph.Providers.VertexProvider();
     this.edgeProvider       = new QuickGraph.Providers.EdgeProvider();
     this.allowParallelEdges = true;
     this.vertexOutEdges     = new VertexEdgesDictionary();
 }
 /// <summary>
 /// Builds a new empty graph
 /// </summary>
 public BidirectionalGraph(
     IVertexProvider vertexProvider,
     IEdgeProvider edgeProvider,
     bool allowParallelEdges
     )
     : base(vertexProvider,edgeProvider,allowParallelEdges)
 {
     m_VertexInEdges = new VertexEdgesDictionary();
 }
Пример #7
0
 /// <summary>
 /// Builds a new empty graph
 /// </summary>
 public BidirectionalGraph(
     IVertexProvider vertexProvider,
     IEdgeProvider edgeProvider,
     bool allowParallelEdges
     )
     : base(vertexProvider, edgeProvider, allowParallelEdges)
 {
     m_VertexInEdges = new VertexEdgesDictionary();
 }
 public AdjacencyGraph(IVertexProvider vertexProvider, IEdgeProvider edgeProvider, bool allowParallelEdges)
 {
     if (vertexProvider == null)
     {
         throw new ArgumentNullException("vertex provider");
     }
     if (edgeProvider == null)
     {
         throw new ArgumentNullException("edge provider");
     }
     this.vertexProvider = vertexProvider;
     this.edgeProvider = edgeProvider;
     this.allowParallelEdges = allowParallelEdges;
     this.vertexOutEdges = new VertexEdgesDictionary();
 }
Пример #9
0
        /// <summary>
        /// Builds a new empty directed graph with custom providers
        /// </summary>
        /// <param name="allowParallelEdges">true if the graph allows
        /// multiple edges</param>
        /// <param name="edgeProvider">custom edge provider</param>
        /// <param name="vertexProvider">custom vertex provider</param>
        /// <exception cref="ArgumentNullException">
        /// vertexProvider or edgeProvider is a null reference
        /// </exception>
        public PetriGraph(
            IVertexProvider vertexProvider,
            IEdgeProvider edgeProvider,
            bool allowParallelEdges
            )
        {
            if (vertexProvider == null)
            {
                throw new ArgumentNullException("vertex provider");
            }
            if (edgeProvider == null)
            {
                throw new ArgumentNullException("edge provider");
            }

            this.vertexProvider     = vertexProvider;
            this.edgeProvider       = edgeProvider;
            this.allowParallelEdges = allowParallelEdges;
            this.vertexOutEdges     = new VertexEdgesDictionary();
        }
Пример #10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="reader"></param>
        protected void ReadGraphXml(XmlReader reader)
        {
            if (!reader.Read() || reader.Name != "graph")
            {
                throw new Exception("could not find graph node");
            }

            // getting types
            MoveToAttribute(reader, "type");
            Type graphType = Type.GetType(reader.Value, true);

            MoveToAttribute(reader, "vertex-provider-type");
            Type vertexProviderType = Type.GetType(reader.Value, true);

            MoveToAttribute(reader, "edge-provider-type");
            Type edgeProviderType = Type.GetType(reader.Value, true);

            MoveToAttribute(reader, "directed");
            bool directed = bool.Parse(reader.Value);

            MoveToAttribute(reader, "allow-parallel-edges");
            bool allowParallelEdges = bool.Parse(reader.Value);

            // create providers
            IVertexProvider vp = (IVertexProvider)vertexProviderType.GetConstructor(Type.EmptyTypes).Invoke(null);
            IEdgeProvider   ep = (IEdgeProvider)edgeProviderType.GetConstructor(Type.EmptyTypes).Invoke(null);

            // create graph
            Type[] gts = new Type[3];
            gts[0] = typeof(IVertexProvider);
            gts[1] = typeof(IEdgeProvider);
            gts[2] = typeof(bool);

            Object[] gps = new Object[3];
            gps[0] = vp;
            gps[1] = ep;
            gps[2] = allowParallelEdges;
            Graph  = (ISerializableVertexAndEdgeListGraph)graphType.GetConstructor(gts).Invoke(gps);
        }
Пример #11
0
    public static GameObject Create(
//		Vector3 position,
        IVertexProvider VertEdge,
        Vector3 upDirection,
        Vector3 bridgeDirection,
        Material material)
    {
        var go = new GameObject("MakeBridgeGeometry.Create();");

        var mf   = go.AddComponent <MeshFilter>();
        var mesh = mf.mesh;

        List <Vector3> newVerts = new List <Vector3>();
        List <int>     newTris  = new List <int>();
        List <Vector2> newUVs   = new List <Vector2>();

        float bridgeDistance = bridgeDirection.magnitude;

        // make a strip going down
        Vector3 prevVert = Vector3.zero;

        Vector2 downUV = new Vector2(0, 1);

        Vector2 leftUV  = new Vector2(0, 0);
        Vector2 rightUV = new Vector2(1, 0);

        // compute where we should go
        Vector3 location = go.transform.position;

        {
            var centroid  = Vector3.zero;
            int vertCount = 0;
            foreach (var v in VertEdge.GetVertices())
            {
                centroid += v;
                vertCount++;
            }
            if (vertCount > 0)
            {
                centroid /= vertCount;
            }

            // stick this bridge geometry origin at the centroid of
            // the edges plus half the bridge distance
            location = centroid + bridgeDirection / 2;;

            go.transform.position = location;
        }

        foreach (var v in VertEdge.GetVertices())
        {
            var v2 = v + bridgeDirection;

            // raycast this part down to match the first collider we hit
            var        ray = new Ray(origin: v2, direction: -upDirection);
            RaycastHit hit;
            if (Physics.Raycast(ray: ray, hitInfo: out hit, maxDistance: 100))
            {
                v2 = hit.point;
            }

            int n = newVerts.Count;

            float vDistance = (v - prevVert).magnitude;

            float step = vDistance / bridgeDistance;

            newVerts.Add(v);
            newVerts.Add(v2);

            newUVs.Add(leftUV);
            newUVs.Add(rightUV);

            leftUV  += downUV * step;
            rightUV += downUV * step;

            if (n > 0)
            {
                newTris.Add(n - 2);
                newTris.Add(n);
                newTris.Add(n - 1);

                newTris.Add(n);
                newTris.Add(n + 1);
                newTris.Add(n - 1);
            }

            prevVert = v;
        }

        // back out our local position from these points,
        // since points are in local space
        for (int i = 0; i < newVerts.Count; i++)
        {
            newVerts[i] -= location;
        }

        mesh.vertices  = newVerts.ToArray();
        mesh.triangles = newTris.ToArray();
        mesh.uv        = newUVs.ToArray();

        mesh.RecalculateBounds();
        mesh.RecalculateNormals();

        mf.mesh = mesh;

        var mr = go.AddComponent <MeshRenderer>();

        mr.material = material;

        return(go);
    }