diff --git a/Fltk/GUI_Projection.cpp b/Fltk/GUI_Projection.cpp index 72fcf3911aca48bd31de3ce3992ac3200235a172..19213ea8b2e48c1132523d73e9ebe0f17c884f80 100644 --- a/Fltk/GUI_Projection.cpp +++ b/Fltk/GUI_Projection.cpp @@ -91,8 +91,8 @@ void uvPlot::draw() sprintf(max, "%g", _dmax); sprintf(pts, "[%d pts]", _f.size()); fl_draw(min, 5, h() - 5); - fl_draw(pts, pw / 2 - fl_width(pts) / 2, h() - 5); - fl_draw(max, pw - fl_width(max) - 5, h() - 5); + fl_draw(pts, pw / 2 - (int)fl_width(pts) / 2, h() - 5); + fl_draw(max, pw - (int)fl_width(max) - 5, h() - 5); } projection::projection(FProjectionFace *f, int x, int y, int w, int h, int BB, int BH, @@ -159,7 +159,7 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces) new Fl_Box(WB, WB + BH, BB / 2, BH, "Select:"); - Fl_Group *o = new Fl_Group(WB, WB, 2 * BB, 3 * BH); + Fl_Group *o = new Fl_Group(WB, WB, 2 * BB, 3 * BH); _select[0] = new Fl_Round_Button(2 * WB + BB / 2, WB, BB, BH, "Points"); _select[0]->value(1); @@ -217,6 +217,7 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces) modes[3] = new Fl_Value_Input(WB + BB / 2, height - 3 * WB - 2 * BH, BB / 2, BH, "Chebychev modes along u and v"); for(int i = 0; i < 4; i++){ + modes[i]->value(8); modes[i]->maximum(128); modes[i]->minimum(1); modes[i]->step(1); @@ -485,95 +486,332 @@ void compute_cb(Fl_Widget *w, void *data) (ve->z() - p[2]) * n[2]); } } + if(f.empty()) return; - // get options: e->modes[i]->value() - Patch* patch = new FPatch(0,ps,u,v,f,3); - patch->SetMinU(0.0); - patch->SetMaxU(0.5); - - double LL[2], LR[2], UL[2], UR[2]; - LL[0] = 0.0; LL[1] = 0.0; - LR[0] = 1.0; LR[1] = 0.0; - UL[0] = 0.0; UL[1] = 1.0; - UR[0] = 1.0; UR[1] = 1.0; - - int i1, i2; - double xx,yy,zz; - - int tagVertex = GMODEL->numVertex(); - patch->F(LL[0],LL[1],xx,yy,zz); - FM_Vertex* vLL = new FM_Vertex(++tagVertex,xx,yy,zz); - GMODEL->add(new FVertex(GMODEL,vLL->GetTag(),vLL)); - patch->F(LR[0],LR[1],xx,yy,zz); - FM_Vertex* vLR = new FM_Vertex(++tagVertex,xx,yy,zz); - GMODEL->add(new FVertex(GMODEL,vLR->GetTag(),vLR)); - patch->F(UL[0],UL[1],xx,yy,zz); - FM_Vertex* vUL = new FM_Vertex(++tagVertex,xx,yy,zz); - GMODEL->add(new FVertex(GMODEL,vUL->GetTag(),vUL)); - patch->F(UR[0],UR[1],xx,yy,zz); - FM_Vertex* vUR = new FM_Vertex(++tagVertex,xx,yy,zz); - GMODEL->add(new FVertex(GMODEL,vUR->GetTag(),vUR)); - - Curve* curveB = new FCurve(0,patch,LL,LR); - Curve* curveR = new FCurve(0,patch,LR,UR); - Curve* curveT = new FCurve(0,patch,UR,UL); - Curve* curveL = new FCurve(0,patch,UL,LL); - - int tagEdge = GMODEL->numEdge(); - FM_Edge* eB = new FM_Edge(++tagEdge,curveB,vLL,vLR); - i1 = eB->GetStartPoint()->GetTag(); - i2 = eB->GetEndPoint()->GetTag(); - GMODEL->add(new FEdge(GMODEL,eB,eB->GetTag(),GMODEL->vertexByTag(i1), - GMODEL->vertexByTag(i2))); - FM_Edge* eR = new FM_Edge(++tagEdge,curveR,vLR,vUR); - i1 = eR->GetStartPoint()->GetTag(); - i2 = eR->GetEndPoint()->GetTag(); - GMODEL->add(new FEdge(GMODEL,eR,eR->GetTag(),GMODEL->vertexByTag(i1), - GMODEL->vertexByTag(i2))); - FM_Edge* eT = new FM_Edge(++tagEdge,curveT,vUR,vUL); - i1 = eT->GetStartPoint()->GetTag(); - i2 = eT->GetEndPoint()->GetTag(); - GMODEL->add(new FEdge(GMODEL,eT,eT->GetTag(),GMODEL->vertexByTag(i1), - GMODEL->vertexByTag(i2))); - FM_Edge* eL = new FM_Edge(++tagEdge,curveL,vUL,vLL); - i1 = eL->GetStartPoint()->GetTag(); - i2 = eL->GetEndPoint()->GetTag(); - GMODEL->add(new FEdge(GMODEL,eL,eL->GetTag(),GMODEL->vertexByTag(i1), - GMODEL->vertexByTag(i2))); - - FM_Face* face = new FM_Face(GMODEL->numFace() + 1,patch); - face->AddEdge(eB); face->AddEdge(eR); face->AddEdge(eT); face->AddEdge(eL); - std::list<GEdge*> l_edges; - for (int j=0;j<face->GetNumEdges();j++) { - int tag = face->GetEdge(j)->GetTag(); - l_edges.push_back(GMODEL->edgeByTag(tag)); + if (ps->IsUPeriodic()) { + Patch* patchL = + new FPatch(0,ps,u,v,f,3,(int)(e->modes[0]->value()), + (int)(e->modes[1]->value()),(int)(e->modes[2]->value()), + (int)(e->modes[3]->value()), e->hardEdges[0]->value(), e->hardEdges[1]->value(), + e->hardEdges[2]->value(), e->hardEdges[3]->value()); + patchL->SetMinU(-0.35); + patchL->SetMaxU(0.35); + + double LL[2], LR[2], UL[2], UR[2]; + LL[0] = 0.0; LL[1] = 0.0; + LR[0] = 1.0; LR[1] = 0.0; + UL[0] = 0.0; UL[1] = 1.0; + UR[0] = 1.0; UR[1] = 1.0; + + int i1, i2; + double xx,yy,zz; + + int tagVertex = GMODEL->numVertex(); + patchL->F(LL[0],LL[1],xx,yy,zz); + FM_Vertex* vLLL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLLL->GetTag(),vLLL)); + patchL->F(LR[0],LR[1],xx,yy,zz); + FM_Vertex* vLLR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLLR->GetTag(),vLLR)); + patchL->F(UL[0],UL[1],xx,yy,zz); + FM_Vertex* vLUL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLUL->GetTag(),vLUL)); + patchL->F(UR[0],UR[1],xx,yy,zz); + FM_Vertex* vLUR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLUR->GetTag(),vLUR)); + + Curve* curveLB = new FCurve(0,patchL,LL,LR); + Curve* curveLR = new FCurve(0,patchL,LR,UR); + Curve* curveLT = new FCurve(0,patchL,UR,UL); + Curve* curveLL = new FCurve(0,patchL,UL,LL); + + int tagEdge = GMODEL->numEdge(); + FM_Edge* eLB = new FM_Edge(++tagEdge,curveLB,vLLL,vLLR); + i1 = eLB->GetStartPoint()->GetTag(); + i2 = eLB->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eLB,eLB->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eLR = new FM_Edge(++tagEdge,curveLR,vLLR,vLUR); + i1 = eLR->GetStartPoint()->GetTag(); + i2 = eLR->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eLR,eLR->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eLT = new FM_Edge(++tagEdge,curveLT,vLUR,vLUL); + i1 = eLT->GetStartPoint()->GetTag(); + i2 = eLT->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eLT,eLT->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eLL = new FM_Edge(++tagEdge,curveLL,vLUL,vLLL); + i1 = eLL->GetStartPoint()->GetTag(); + i2 = eLL->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eLL,eLL->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + + FM_Face* faceL = new FM_Face(GMODEL->numFace() + 1,patchL); + faceL->AddEdge(eLB); faceL->AddEdge(eLR); + faceL->AddEdge(eLT); faceL->AddEdge(eLL); + std::list<GEdge*> l_edgesL; + for (int j=0;j<faceL->GetNumEdges();j++) { + int tag = faceL->GetEdge(j)->GetTag(); + l_edgesL.push_back(GMODEL->edgeByTag(tag)); + } + GMODEL->add(new FFace(GMODEL,faceL,faceL->GetTag(),l_edgesL)); + + Patch* patchR = + new FPatch(0,ps,u,v,f,3,(int)(e->modes[0]->value()), + (int)(e->modes[1]->value()),(int)(e->modes[2]->value()), + (int)(e->modes[3]->value()), e->hardEdges[0]->value(), e->hardEdges[1]->value(), + e->hardEdges[2]->value(), e->hardEdges[3]->value()); + patchR->SetMinU(0.15); + patchR->SetMaxU(0.85); + + tagVertex = GMODEL->numVertex(); + patchR->F(LL[0],LL[1],xx,yy,zz); + FM_Vertex* vRLL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vRLL->GetTag(),vRLL)); + patchR->F(LR[0],LR[1],xx,yy,zz); + FM_Vertex* vRLR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vRLR->GetTag(),vRLR)); + patchR->F(UL[0],UL[1],xx,yy,zz); + FM_Vertex* vRUL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vRUL->GetTag(),vRUL)); + patchR->F(UR[0],UR[1],xx,yy,zz); + FM_Vertex* vRUR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vRUR->GetTag(),vRUR)); + + Curve* curveRB = new FCurve(0,patchR,LL,LR); + Curve* curveRR = new FCurve(0,patchR,LR,UR); + Curve* curveRT = new FCurve(0,patchR,UR,UL); + Curve* curveRL = new FCurve(0,patchR,UL,LL); + + tagEdge = GMODEL->numEdge(); + FM_Edge* eRB = new FM_Edge(++tagEdge,curveRB,vRLL,vRLR); + i1 = eRB->GetStartPoint()->GetTag(); + i2 = eRB->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eRB,eRB->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eRR = new FM_Edge(++tagEdge,curveRR,vRLR,vRUR); + i1 = eRR->GetStartPoint()->GetTag(); + i2 = eRR->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eRR,eRR->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eRT = new FM_Edge(++tagEdge,curveRT,vRUR,vRUL); + i1 = eRT->GetStartPoint()->GetTag(); + i2 = eRT->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eRT,eRT->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eRL = new FM_Edge(++tagEdge,curveRL,vRUL,vRLL); + i1 = eRL->GetStartPoint()->GetTag(); + i2 = eRL->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eRL,eRL->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + + FM_Face* faceR = new FM_Face(GMODEL->numFace() + 1,patchR); + faceR->AddEdge(eRB); faceR->AddEdge(eRR); + faceR->AddEdge(eRT); faceR->AddEdge(eRL); + std::list<GEdge*> l_edgesR; + for (int j=0;j<faceR->GetNumEdges();j++) { + int tag = faceR->GetEdge(j)->GetTag(); + l_edgesR.push_back(GMODEL->edgeByTag(tag)); + } + GMODEL->add(new FFace(GMODEL,faceR,faceR->GetTag(),l_edgesR)); + } + else if (ps->IsVPeriodic()) { + Patch* patchL = + new FPatch(0,ps,u,v,f,3,(int)(e->modes[0]->value()), + (int)(e->modes[1]->value()),(int)(e->modes[2]->value()), + (int)(e->modes[3]->value()), e->hardEdges[0]->value(), e->hardEdges[1]->value(), + e->hardEdges[2]->value(), e->hardEdges[3]->value()); + patchL->SetMinV(-0.35); + patchL->SetMaxV(0.35); + + double LL[2], LR[2], UL[2], UR[2]; + LL[0] = 0.0; LL[1] = 0.0; + LR[0] = 1.0; LR[1] = 0.0; + UL[0] = 0.0; UL[1] = 1.0; + UR[0] = 1.0; UR[1] = 1.0; + + int i1, i2; + double xx,yy,zz; + + int tagVertex = GMODEL->numVertex(); + patchL->F(LL[0],LL[1],xx,yy,zz); + FM_Vertex* vLLL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLLL->GetTag(),vLLL)); + patchL->F(LR[0],LR[1],xx,yy,zz); + FM_Vertex* vLLR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLLR->GetTag(),vLLR)); + patchL->F(UL[0],UL[1],xx,yy,zz); + FM_Vertex* vLUL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLUL->GetTag(),vLUL)); + patchL->F(UR[0],UR[1],xx,yy,zz); + FM_Vertex* vLUR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLUR->GetTag(),vLUR)); + + Curve* curveLB = new FCurve(0,patchL,LL,LR); + Curve* curveLR = new FCurve(0,patchL,LR,UR); + Curve* curveLT = new FCurve(0,patchL,UR,UL); + Curve* curveLL = new FCurve(0,patchL,UL,LL); + + int tagEdge = GMODEL->numEdge(); + FM_Edge* eLB = new FM_Edge(++tagEdge,curveLB,vLLL,vLLR); + i1 = eLB->GetStartPoint()->GetTag(); + i2 = eLB->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eLB,eLB->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eLR = new FM_Edge(++tagEdge,curveLR,vLLR,vLUR); + i1 = eLR->GetStartPoint()->GetTag(); + i2 = eLR->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eLR,eLR->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eLT = new FM_Edge(++tagEdge,curveLT,vLUR,vLUL); + i1 = eLT->GetStartPoint()->GetTag(); + i2 = eLT->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eLT,eLT->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eLL = new FM_Edge(++tagEdge,curveLL,vLUL,vLLL); + i1 = eLL->GetStartPoint()->GetTag(); + i2 = eLL->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eLL,eLL->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + + FM_Face* faceL = new FM_Face(GMODEL->numFace() + 1,patchL); + faceL->AddEdge(eLB); faceL->AddEdge(eLR); + faceL->AddEdge(eLT); faceL->AddEdge(eLL); + std::list<GEdge*> l_edgesL; + for (int j=0;j<faceL->GetNumEdges();j++) { + int tag = faceL->GetEdge(j)->GetTag(); + l_edgesL.push_back(GMODEL->edgeByTag(tag)); + } + GMODEL->add(new FFace(GMODEL,faceL,faceL->GetTag(),l_edgesL)); + + Patch* patchR = + new FPatch(0,ps,u,v,f,3,(int)(e->modes[0]->value()), + (int)(e->modes[1]->value()),(int)(e->modes[2]->value()), + (int)(e->modes[3]->value()), e->hardEdges[0]->value(), e->hardEdges[1]->value(), + e->hardEdges[2]->value(), e->hardEdges[3]->value()); + patchR->SetMinV(0.15); + patchR->SetMaxV(0.85); + + tagVertex = GMODEL->numVertex(); + patchR->F(LL[0],LL[1],xx,yy,zz); + FM_Vertex* vRLL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vRLL->GetTag(),vRLL)); + patchR->F(LR[0],LR[1],xx,yy,zz); + FM_Vertex* vRLR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vRLR->GetTag(),vRLR)); + patchR->F(UL[0],UL[1],xx,yy,zz); + FM_Vertex* vRUL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vRUL->GetTag(),vRUL)); + patchR->F(UR[0],UR[1],xx,yy,zz); + FM_Vertex* vRUR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vRUR->GetTag(),vRUR)); + + Curve* curveRB = new FCurve(0,patchR,LL,LR); + Curve* curveRR = new FCurve(0,patchR,LR,UR); + Curve* curveRT = new FCurve(0,patchR,UR,UL); + Curve* curveRL = new FCurve(0,patchR,UL,LL); + + tagEdge = GMODEL->numEdge(); + FM_Edge* eRB = new FM_Edge(++tagEdge,curveRB,vRLL,vRLR); + i1 = eRB->GetStartPoint()->GetTag(); + i2 = eRB->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eRB,eRB->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eRR = new FM_Edge(++tagEdge,curveRR,vRLR,vRUR); + i1 = eRR->GetStartPoint()->GetTag(); + i2 = eRR->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eRR,eRR->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eRT = new FM_Edge(++tagEdge,curveRT,vRUR,vRUL); + i1 = eRT->GetStartPoint()->GetTag(); + i2 = eRT->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eRT,eRT->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eRL = new FM_Edge(++tagEdge,curveRL,vRUL,vRLL); + i1 = eRL->GetStartPoint()->GetTag(); + i2 = eRL->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eRL,eRL->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + + FM_Face* faceR = new FM_Face(GMODEL->numFace() + 1,patchR); + faceR->AddEdge(eRB); faceR->AddEdge(eRR); + faceR->AddEdge(eRT); faceR->AddEdge(eRL); + std::list<GEdge*> l_edgesR; + for (int j=0;j<faceR->GetNumEdges();j++) { + int tag = faceR->GetEdge(j)->GetTag(); + l_edgesR.push_back(GMODEL->edgeByTag(tag)); + } + GMODEL->add(new FFace(GMODEL,faceR,faceR->GetTag(),l_edgesR)); } - GMODEL->add(new FFace(GMODEL,face,face->GetTag(),l_edges)); - - int nU=64; - int nV=64; - - std::vector<int> color(3); - - std::vector<std::vector<double> > x(nU,std::vector<double>(nV)); - std::vector<std::vector<double> > y(nU,std::vector<double>(nV)); - std::vector<std::vector<double> > z(nU,std::vector<double>(nV)); - - std::vector<std::vector<int> > mask = ones(nU,nV); - - double hU = 1./(nU-1); - double hV = 1./(nV-1); - - for (int j=0;j<nU;j++) { - for (int k=0;k<nV;k++) { - double u = j*hU; - double v = k*hV; - patch->F(u,v,x[j][k],y[j][k],z[j][k]); + else { + Patch* patch = + new FPatch(0,ps,u,v,f,3,(int)(e->modes[0]->value()), + (int)(e->modes[1]->value()),(int)(e->modes[2]->value()), + (int)(e->modes[3]->value()), e->hardEdges[0]->value(), e->hardEdges[1]->value(), + e->hardEdges[2]->value(), e->hardEdges[3]->value()); + + double LL[2], LR[2], UL[2], UR[2]; + LL[0] = 0.0; LL[1] = 0.0; + LR[0] = 1.0; LR[1] = 0.0; + UL[0] = 0.0; UL[1] = 1.0; + UR[0] = 1.0; UR[1] = 1.0; + + int i1, i2; + double xx,yy,zz; + + int tagVertex = GMODEL->numVertex(); + patch->F(LL[0],LL[1],xx,yy,zz); + FM_Vertex* vLL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLL->GetTag(),vLL)); + patch->F(LR[0],LR[1],xx,yy,zz); + FM_Vertex* vLR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vLR->GetTag(),vLR)); + patch->F(UL[0],UL[1],xx,yy,zz); + FM_Vertex* vUL = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vUL->GetTag(),vUL)); + patch->F(UR[0],UR[1],xx,yy,zz); + FM_Vertex* vUR = new FM_Vertex(++tagVertex,xx,yy,zz); + GMODEL->add(new FVertex(GMODEL,vUR->GetTag(),vUR)); + + Curve* curveB = new FCurve(0,patch,LL,LR); + Curve* curveR = new FCurve(0,patch,LR,UR); + Curve* curveT = new FCurve(0,patch,UR,UL); + Curve* curveL = new FCurve(0,patch,UL,LL); + + int tagEdge = GMODEL->numEdge(); + FM_Edge* eB = new FM_Edge(++tagEdge,curveB,vLL,vLR); + i1 = eB->GetStartPoint()->GetTag(); + i2 = eB->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eB,eB->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eR = new FM_Edge(++tagEdge,curveR,vLR,vUR); + i1 = eR->GetStartPoint()->GetTag(); + i2 = eR->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eR,eR->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eT = new FM_Edge(++tagEdge,curveT,vUR,vUL); + i1 = eT->GetStartPoint()->GetTag(); + i2 = eT->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eT,eT->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + FM_Edge* eL = new FM_Edge(++tagEdge,curveL,vUL,vLL); + i1 = eL->GetStartPoint()->GetTag(); + i2 = eL->GetEndPoint()->GetTag(); + GMODEL->add(new FEdge(GMODEL,eL,eL->GetTag(),GMODEL->vertexByTag(i1), + GMODEL->vertexByTag(i2))); + + FM_Face* face = new FM_Face(GMODEL->numFace() + 1,patch); + face->AddEdge(eB); face->AddEdge(eR); + face->AddEdge(eT); face->AddEdge(eL); + std::list<GEdge*> l_edges; + for (int j=0;j<face->GetNumEdges();j++) { + int tag = face->GetEdge(j)->GetTag(); + l_edges.push_back(GMODEL->edgeByTag(tag)); } + GMODEL->add(new FFace(GMODEL,face,face->GetTag(),l_edges)); } - color[0] = 0; color[1] = 0; color[2] = 1; - plotSceneViewer(0,"patch.iv",color,x,y,z,nU,nV,mask); } Draw(); diff --git a/contrib/FourierModel/FPatch.cpp b/contrib/FourierModel/FPatch.cpp index df3c873346a520e69d8b18cf9efe7053c2b0a6a6..f9213a714fdf9cc37d70765450bd7cc6660e57e0 100644 --- a/contrib/FourierModel/FPatch.cpp +++ b/contrib/FourierModel/FPatch.cpp @@ -10,7 +10,9 @@ extern "C" { FPatch::FPatch(int tag, ProjectionSurface* ps, std::vector<double> &u, std::vector<double> &v, - std::vector< std::complex<double> > &data, int derivative) + std::vector< std::complex<double> > &data, int derivative, + int uModes, int vModes, int uM, int vM, + bool hardEdge0, bool hardEdge1, bool hardEdge2, bool hardEdge3) : _coeffOriginalData(0),_coeffData(0),_coeffDerivU(0), _coeffDerivV(0),_coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0) { @@ -19,16 +21,21 @@ FPatch::FPatch(int tag, ProjectionSurface* ps, _tag = tag; _derivative = derivative; - _uModes = 10; - _vModes = 8; + _uModes = uModes; + _vModes = vModes; - _uM = 16+1; - _vM = 16; + _uM = (int)(log((double)uM) / log(2.)); + _vM = (int)(log((double)vM) / log(2.)); - _hardEdge[0] = false; - _hardEdge[1] = false; - _hardEdge[2] = false; - _hardEdge[3] = false; + if (_ps->IsUPeriodic()) + _uM++; + if (_ps->IsVPeriodic()) + _vM++; + + _hardEdge[0] = hardEdge0; + _hardEdge[1] = hardEdge1; + _hardEdge[2] = hardEdge2; + _hardEdge[3] = hardEdge3; if (_ps->IsUPeriodic()) _periodicityU = 1; diff --git a/contrib/FourierModel/FPatch.h b/contrib/FourierModel/FPatch.h index 1a1abd2045d25e5292fe69d112fb765f20ac682d..2fe01624a6c25e9bc81ba23ed536917b95f10acb 100644 --- a/contrib/FourierModel/FPatch.h +++ b/contrib/FourierModel/FPatch.h @@ -1,6 +1,7 @@ #ifndef _F_PATCH_H_ #define _F_PATCH_H_ +#include <cmath> #include <vector> #include <fftw3.h> #include <complex> @@ -69,7 +70,10 @@ class FPatch : public Patch { FPatch (int tag, ProjectionSurface* ps, std::vector<double> &u, std::vector<double> &v, - std::vector< std::complex<double> > &data,int derivative = 0); + std::vector< std::complex<double> > &data, int derivative = 3, + int uModes = 10, int vModes = 8, int uM = 17, int vM = 16, + bool hardEdge0 = false, bool hardEdge1 = false, bool hardEdge2 = false, + bool hardEdge3 = false); virtual ~FPatch(); // Abstract functions of Patch