Exemplo n.º 1
0
        public List <Face> ComputeFaces()
        {
            // let's compose the face between those 2 faces
            List <Face> subFaces = new List <Face>();
            int         limit    = Math.Min(f1.pts.Count - 1, f2.pts.Count - 1);

            if (limit >= 1)
            {
                for (int i = 0; i < limit; i++)
                {
                    Face tempFace = new Face();
                    tempFace.Add(f1.pts[i]);
                    tempFace.Add(f1.pts[i + 1]);
                    tempFace.Add(f2.pts[i + 1]);
                    tempFace.Add(f2.pts[i]);
                    tempFace.orientation = orientation;
                    subFaces.Add(tempFace);
                }

                Face temp = new Face();
                temp.Add(f1.pts[limit]);
                temp.Add(f1.pts[0]);
                temp.Add(f2.pts[0]);
                temp.Add(f2.pts[limit]);
                temp.orientation = orientation;
                subFaces.Add(temp);
            }

            return(subFaces);
        }
Exemplo n.º 2
0
        /// <summary>
        /// takes a single set of vertices and transforms it into a set of faces describing the face joining the 2wires contained inside the set
        /// </summary>
        /// <param name="face1">first face</param>
        /// <param name="face2">second face</param>
        /// <param name="orientation">orientation of the face</param>
        /// <returns>a set of faces</returns>
        public List <Face> ComputeFaces(Face face1, Face face2, TopAbs_Orientation orientation)
        {
            // let's compose the face between those 2 faces
            List <Face> subFaces = new List <Face>();
            int         limit    = Math.Min(face1.pts.Count - 1, face2.pts.Count - 1);

            for (int i = 0; i < limit; i++)
            {
                Face tempFace = new Face();
                tempFace.Add(face1.pts[i]);
                tempFace.Add(face1.pts[i + 1]);
                tempFace.Add(face2.pts[i + 1]);
                tempFace.Add(face2.pts[i]);
                tempFace.orientation = orientation;
                subFaces.Add(tempFace);
            }

            Face temp = new Face();

            temp.Add(face1.pts[limit]);
            temp.Add(face1.pts[0]);
            temp.Add(face2.pts[0]);
            temp.Add(face2.pts[limit]);
            temp.orientation = orientation;
            subFaces.Add(temp);
            mesh = new MyMesh(subFaces);
            return(subFaces);
        }
Exemplo n.º 3
0
        private List <Face> GetFaces(List <gp_Pnt> faces)
        {
            bool uniqueFace = true;
            Face unique     = new Face();

            foreach (gp_Pnt pt in faces)
            {
                if (unique.Contains(pt))
                {
                    unique.Add(pt);
                }
                else
                {
                    uniqueFace = false;
                }
            }


            Face f1 = new Face();
            Face f2 = new Face();

            if (!uniqueFace)
            {
                foreach (gp_Pnt pt in faces)
                {
                    if (f1.pts.Count < faces.Count / 2)
                    {
                        if (f1.Contains(pt))
                        {
                            f1.Add(pt);
                        }
                        else
                        {
                            f2.Add(pt);
                        }
                    }
                    else
                    {
                        if (f2.Contains(pt))
                        {
                            f2.Add(pt);
                        }
                        else
                        {
                            f1.Add(pt);
                        }
                    }
                }
            }
            else
            {
                // we got one unique face... well in fact this face is constituted of two sets of vertices, one exterior and one interior, here we manage to create two faces from this face
                f1 = new Face(unique.ToTrianglesGraham(false).pts); // set exterior
                f2 = faces.Count - f1.pts.Count >= 3 ? new Face(f1.Difference(unique).ToTrianglesGraham(false).pts) : new Face(f1.Difference(unique).pts);
            }//*/

            return(new List <Face> {
                f1, f2
            });
        }
Exemplo n.º 4
0
 internal bool parseFace(TextReader tr, bool triangle_only = false)
 {
     while (true)
     {
         string str = tr.ReadLine().Trim();
         if (str.EndsWith("}"))
         {
             return(true);
         }
         else
         {
             MQOFace f = MQOFace.parse(this, str);
             if (f == null)
             {
                 return(false);
             }
             if (triangle_only)
             {
                 Face.AddRange(f.triangle_divide());
             }
             else
             {
                 Face.Add(f);
             }
             continue;
         }
     }
 }
Exemplo n.º 5
0
    public Graph Copy()
    {
        var graph = new Graph();

        foreach (Edge edge in Edges.Keys)
        {
            var start = graph.Add(edge.start.Copy());
            var end   = graph.Add(edge.end.Copy());
            graph.Add(new Edge(start, end));
        }

        foreach (KeyValuePair <Vertex, Face> pair in Faces)
        {
            var face = new Face(pair.Key.Copy());
            foreach (Edge old in pair.Value.Edges.Values)
            {
                var edge = graph.Add(old);
                face.Add(edge);
                face.OwnedByPlayer1 = pair.Value.OwnedByPlayer1;
            }
            graph.Faces.Add(face.Point, face);
        }

        return(graph);
    }
Exemplo n.º 6
0
        public void Add(string name, string face)
        {
            int index = Name.IndexOf(name) + 1;

            if (index == 0)
            {
                if (DeletedNamesId.Count > 0)
                {
                    Name[DeletedNamesId[0]] = name;
                    NameId.Add(DeletedNamesId[0] + 1);
                    DeletedNamesId.RemoveAt(0);
                }
                else
                {
                    Name.Add(name);
                    NameId.Add(Name.Count());
                }
            }
            else
            {
                NameId.Add(index);
            }
            Face.Add(face);
        }
Exemplo n.º 7
0
        public void Testing()
        {
            const double s = 5.0;
            var v0 = new Vertex("v0", new Vect3(0, 0, 0));
            var v1 = new Vertex("v1", new Vect3(0, 0, s));
            var v2 = new Vertex("v2", new Vect3(s, 0, s));
            var v3 = new Vertex("v3", new Vect3(s, 0, 0));
            var v4 = new Vertex("v4", new Vect3(0, s, 0));
            var v5 = new Vertex("v5", new Vect3(0, s, s));
            var v6 = new Vertex("v6", new Vect3(s, s, s));
            var v7 = new Vertex("v7", new Vect3(s, s, 0));

            var f0 = new Face("f0");
            var f1 = new Face("f1");
            var f2 = new Face("f2");
            var f3 = new Face("f3");
            var f4 = new Face("f4");
            var f5 = new Face("f5");
            LineHalfEdge e0a = null;
            LineHalfEdge e0b = null;
            LineHalfEdge e1a = null;
            LineHalfEdge e1b = null;
            LineHalfEdge e2a = null;
            LineHalfEdge e2b = null;
            LineHalfEdge e3a = null;
            LineHalfEdge e3b = null;
            LineHalfEdge e4a = null;
            LineHalfEdge e4b = null;
            LineHalfEdge e5a = null;
            LineHalfEdge e5b = null;
            LineHalfEdge e6a = null;
            LineHalfEdge e6b = null;
            LineHalfEdge e7a = null;
            LineHalfEdge e7b = null;
            LineHalfEdge e8a = null;
            LineHalfEdge e8b = null;
            LineHalfEdge e9a = null;
            LineHalfEdge e9b = null;
            LineHalfEdge e10a = null;
            LineHalfEdge e10b = null;
            LineHalfEdge e11a = null;
            LineHalfEdge e11b = null;

            e0a = new LineHalfEdge("e0a", v1, new Lazy<IHalfEdge>(() => e0b));
            e1a = new LineHalfEdge("e1a", v2, new Lazy<IHalfEdge>(() => e1b));
            e2a = new LineHalfEdge("e2a", v3, new Lazy<IHalfEdge>(() => e2b));
            e3a = new LineHalfEdge("e3a", v0, new Lazy<IHalfEdge>(() => e3b));
            f0.Add(new EdgeLoop(f0, e0a, e1a, e2a, e3a));

            e0b = new LineHalfEdge("e0b", v0, new Lazy<IHalfEdge>(() => e0a));
            e7a = new LineHalfEdge("e7a", v4, new Lazy<IHalfEdge>(() => e7b));
            e8a = new LineHalfEdge("e8a", v5, new Lazy<IHalfEdge>(() => e8b));
            e4a = new LineHalfEdge("e4a", v1, new Lazy<IHalfEdge>(() => e4b));
            f1.Add(new EdgeLoop(f1, e0b, e7a, e8a, e4a));

            e1b = new LineHalfEdge("e1b", v1, new Lazy<IHalfEdge>(() => e1a));
            e4b = new LineHalfEdge("e4b", v5, new Lazy<IHalfEdge>(() => e4a));
            e9a = new LineHalfEdge("e9a", v6, new Lazy<IHalfEdge>(() => e9b));
            e5a = new LineHalfEdge("e5a", v2, new Lazy<IHalfEdge>(() => e5b));
            f2.Add(new EdgeLoop(f2, e1b, e4b, e9a, e5a));

            e2b = new LineHalfEdge("e2b", v2, new Lazy<IHalfEdge>(() => e2a));
            e5b = new LineHalfEdge("e5b", v6, new Lazy<IHalfEdge>(() => e5a));
            e10a = new LineHalfEdge("e10a", v7, new Lazy<IHalfEdge>(() => e10b));
            e6a = new LineHalfEdge("e6a", v3, new Lazy<IHalfEdge>(() => e6b));
            f3.Add(new EdgeLoop(f3, e2b, e5b, e10a, e6a));

            e3b = new LineHalfEdge("e3b", v3, new Lazy<IHalfEdge>(() => e3a));
            e6b = new LineHalfEdge("e6b", v7, new Lazy<IHalfEdge>(() => e6a));
            e11a = new LineHalfEdge("e11a", v4, new Lazy<IHalfEdge>(() => e11b));
            e7b = new LineHalfEdge("e7b", v0, new Lazy<IHalfEdge>(() => e7a));
            f4.Add(new EdgeLoop(f4, e3b, e6b, e11a, e7b));

            e8b = new LineHalfEdge("e8b", v4, new Lazy<IHalfEdge>(() => e8a));
            e11b = new LineHalfEdge("e11b", v7, new Lazy<IHalfEdge>(() => e11a));
            e10b = new LineHalfEdge("e10b", v6, new Lazy<IHalfEdge>(() => e10a));
            e9b = new LineHalfEdge("e9b", v5, new Lazy<IHalfEdge>(() => e9b));
            f5.Add(new EdgeLoop(f5, e8b, e11b, e10b, e9b));

            var shell = new Shell(f0, f1, f2, f3, f4, f5);

            foreach (var face in shell.Faces)
            {
                Debug.WriteLine("---------------");
                Debug.WriteLine("{0}".fmt(face.Name));
                foreach (var loop in face.Loops)
                {
                    foreach (var edge in loop.Edges)
                    {
                        Debug.WriteLine(edge.Name);
                    }
                }
            }
            Assert.True(true);
        }
Exemplo n.º 8
0
        public static RawPrimitive LoadObject(string[] File)
        {
            var parser    = new ObjLineGrammar();
            var verticies = new List <Vector3>();
            var texCoords = new List <Vector2>();
            var faces     = new List <Face>();

            foreach (var line in File)
            {
                if (String.IsNullOrEmpty(line))
                {
                    continue;
                }
                if (line.StartsWith("#"))
                {
                    continue;
                }

                var result = parser.ParseString(line);
                if (result.ResultType != Ancora.ResultType.Success)
                {
                    continue;
                }

                switch (result.Node.Children[0].Value.ToString())
                {
                case "v":
                    verticies.Add(new Vector3((float)result.Node.Children[1].Value, (float)result.Node.Children[2].Value, (float)result.Node.Children[3].Value));
                    break;

                case "vt":
                    texCoords.Add(new Vector2((float)result.Node.Children[1].Value, 1.0f - (float)result.Node.Children[2].Value));
                    break;

                case "f":
                {
                    var f = new Face();
                    for (var i = 1; i < result.Node.Children.Count; i += 3)
                    {
                        f.Add(new Corner {
                                Vertex = (int)(float)result.Node.Children[i].Value, TexCoord = (int)(float)result.Node.Children[i + 2].Value
                            });
                    }
                    faces.Add(f);
                }
                break;

                default:
                    break;
                }
            }

            var r = new RawPrimitive();

            foreach (var face in faces)
            {
                for (var i = 2; i < face.Count; ++i)
                {
                    r.AddTriangle(
                        new ExtendedVertex(verticies[face[0].Vertex - 1], Color.White, Color.White, texCoords[face[0].TexCoord - 1], new Vector4(0, 0, 1, 1)),
                        new ExtendedVertex(verticies[face[i - 1].Vertex - 1], Color.White, Color.White, texCoords[face[i - 1].TexCoord - 1], new Vector4(0, 0, 1, 1)),
                        new ExtendedVertex(verticies[face[i].Vertex - 1], Color.White, Color.White, texCoords[face[i].TexCoord - 1], new Vector4(0, 0, 1, 1)));
                }
            }

            return(r);
        }