Exemplo n.º 1
0
 // Constructs a face node and sets its parent
 public FaceNode(FaceNode p, Face f)
 {
     sons   = new List <FaceNode>();
     face   = f;
     parent = p;
     p.addSon(this);
 }
Exemplo n.º 2
0
    // Creates vertices, edges and faces and inserts them in the model's strucutre
    public void generateNewCreases(Plane p)
    {
        List <EdgeNode> activeEdgeNodes = edgeBTL.getLeaveNodes();
        List <Vertex>   activeVertices  = getVertices();

        List <Vertex> cutVertices = new List <Vertex>();

        /// si tallo un vertex el tinc en compte d(etermineSide =0)
        for (int i = 0; i < activeVertices.Count; i++)
        {
            if (p.determineSide(activeVertices[i]) == 0)
            {
                cutVertices.Add(activeVertices[i]);
            }
        }

        /// per cada aresta que es talla faig split i genero un vertex
        for (int i = 0; i < activeEdgeNodes.Count; i++)

        {
            EdgeNode parent = activeEdgeNodes[i];
            Vertex   o      = parent.getEdge().origin;
            Vertex   e      = parent.getEdge().end;


            Vector3 point = parent.getEdge().isCut(p);

            Vector3 inf = new Vector3(999999, 999999, 999999);

            if (point != inf)
            {
                Vertex v = new Vertex(point, step);
                cutVertices.Add(v);
                vertexLL.addVertex(v);

                Edge     edgel = new Edge(o, v, step);
                EdgeNode ls    = new EdgeNode(parent, edgel);

                Edge     edger = new Edge(v, e, step);
                EdgeNode rs    = new EdgeNode(parent, edger);

                v.addEdge(edgel);
                v.addEdge(edger);

                parent.setSons(ls, rs);
            }
        }

        /// per cada vertex que comparteix cara 2 a 2 genero una aresta
        for (int i = 0; i < cutVertices.Count; i++)
        {
            for (int j = i + 1; j < cutVertices.Count; j++)
            {
                FaceNode f = shareFace(cutVertices[i], cutVertices[j]);
                if (f != null)
                {
                    Edge e = new Edge(cutVertices[i], cutVertices[j], step);
                    cutVertices[i].addEdge(e);
                    cutVertices[j].addEdge(e);

                    edgeBTL.addEdge(e);

                    /// genero cares
                    /// agafo tots els vertex de la cara original i elsdaquesta aresta nova
                    /// filtro repetits
                    ///si estan a laresta van als dos
                    ///s determineside de tots
                    ///0 als 2
                    ///1 a f1
                    ///-1 f2
                    ///
                    List <Vertex> l = f.getFace().getVertices();

                    if (!l.Contains(cutVertices[i]))
                    {
                        l.Add(cutVertices[i]);
                    }
                    if (!l.Contains(cutVertices[j]))
                    {
                        l.Add(cutVertices[j]);
                    }
                    int           side;
                    List <Vertex> l1 = new List <Vertex>();
                    List <Vertex> l2 = new List <Vertex>();

                    for (int k = 0; k < l.Count; k++)
                    {
                        side = p.determineSide(l[k]);
                        if (side == 1)
                        {
                            l1.Add(l[k]);
                        }
                        else if (side == -1)
                        {
                            l2.Add(l[k]);
                        }
                        else
                        {
                            l1.Add(l[k]);
                            l2.Add(l[k]);
                        }
                    }

                    Face f1 = new Face(l1, step);
                    Face f2 = new Face(l2, step);

                    FaceNode fn1 = new FaceNode(f, f1);
                    FaceNode fn2 = new FaceNode(f, f2);

                    f.addSon(fn1);
                    f.addSon(fn2);
                }
            }
        }
    }