/* splits an edge into 2 edges. The new vertex and edge are added * to the sshape list of vertices and edges * a new chain is also created. * returns the new edge. * ioEdge * The edge that gets splitted * newpoint * x,y,z coordinates of the new point. */ FEdge* SShape::SplitEdgeIn2(FEdge* ioEdge, SVertex * ioNewVertex) { SVertex *A = ioEdge->vertexA(); SVertex *B = ioEdge->vertexB(); // We split edge AB into AA' and A'B. A' and A'B are created. // AB becomes (address speaking) AA'. B is updated. //-------------------------------------------------- // a new edge, A'B is created. FEdge *newEdge; if (ioEdge->getNature() & Nature::ALL_INTERSECTION) { newEdge = new FEdgeIntersection(ioNewVertex, B); FEdgeIntersection * se = dynamic_cast<FEdgeIntersection*>(newEdge); FEdgeIntersection * fes = dynamic_cast<FEdgeIntersection*>(ioEdge); se->SetMaterialIndex(fes->materialIndex()); se->SetFaces(fes->getFace1(), fes->getFace2()); #ifdef DEBUG_INTERSECTION void debugFES(FEdgeIntersection * newEdge); debugFES(se); debugFES(fes); #endif }else if(ioEdge->isSmooth()){ newEdge = new FEdgeSmooth(ioNewVertex, B); FEdgeSmooth * se = dynamic_cast<FEdgeSmooth*>(newEdge); FEdgeSmooth * fes = dynamic_cast<FEdgeSmooth*>(ioEdge); se->SetMaterialIndex(fes->materialIndex()); se->SetFace(fes->face()); }else{ newEdge = new FEdgeSharp(ioNewVertex, B); FEdgeSharp * se = dynamic_cast<FEdgeSharp*>(newEdge); FEdgeSharp * fes = dynamic_cast<FEdgeSharp*>(ioEdge); se->SetaMaterialIndex(fes->aMaterialIndex()); se->SetbMaterialIndex(fes->bMaterialIndex()); se->SetEdge(fes->edge()); } newEdge->SetNature(ioEdge->getNature()); if(ioEdge->nextEdge() != 0) ioEdge->nextEdge()->SetPreviousEdge(newEdge); // update edge A'B for the next pointing edge newEdge->SetNextEdge(ioEdge->nextEdge()); // update edge A'B for the previous pointing edge newEdge->SetPreviousEdge(0); // because it is now a ViewVertex Id id(ioEdge->getId().getFirst(), ioEdge->getId().getSecond()+1); newEdge->SetId(ioEdge->getId()); ioEdge->SetId(id); // update edge AA' for the next pointing edge ioEdge->SetNextEdge(0); // because it is now a TVertex // update vertex pointing edges list: // -- vertex B -- B->Replace(ioEdge, newEdge); // -- vertex A' -- ioNewVertex->AddFEdge(ioEdge); ioNewVertex->AddFEdge(newEdge); // to build a new chain: AddChain(newEdge); AddEdge(newEdge); // FIXME ?? // The edge AB becomes edge AA'. ioEdge->SetVertexB(ioNewVertex); // added by Aaron (looks redundant now, can probably be deleted) newEdge->SetVertexA(ioNewVertex); newEdge->SetVertexB(B); // if(ioEdge->isSmooth()){ // ((FEdgeSmooth*)newEdge)->SetFace(((FEdgeSmooth*)ioEdge)->face()); //} return newEdge; }