Skip to content
Snippets Groups Projects
Commit 20acb677 authored by Akash Anand's avatar Akash Anand
Browse files

work on fm

parent c99be7c3
Branches
Tags
No related merge requests found
...@@ -91,8 +91,8 @@ void uvPlot::draw() ...@@ -91,8 +91,8 @@ void uvPlot::draw()
sprintf(max, "%g", _dmax); sprintf(max, "%g", _dmax);
sprintf(pts, "[%d pts]", _f.size()); sprintf(pts, "[%d pts]", _f.size());
fl_draw(min, 5, h() - 5); fl_draw(min, 5, h() - 5);
fl_draw(pts, pw / 2 - fl_width(pts) / 2, h() - 5); fl_draw(pts, pw / 2 - (int)fl_width(pts) / 2, h() - 5);
fl_draw(max, pw - fl_width(max) - 5, 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, projection::projection(FProjectionFace *f, int x, int y, int w, int h, int BB, int BH,
...@@ -217,6 +217,7 @@ projectionEditor::projectionEditor(std::vector<FProjectionFace*> &faces) ...@@ -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, modes[3] = new Fl_Value_Input(WB + BB / 2, height - 3 * WB - 2 * BH, BB / 2, BH,
"Chebychev modes along u and v"); "Chebychev modes along u and v");
for(int i = 0; i < 4; i++){ for(int i = 0; i < 4; i++){
modes[i]->value(8);
modes[i]->maximum(128); modes[i]->maximum(128);
modes[i]->minimum(1); modes[i]->minimum(1);
modes[i]->step(1); modes[i]->step(1);
...@@ -485,12 +486,271 @@ void compute_cb(Fl_Widget *w, void *data) ...@@ -485,12 +486,271 @@ void compute_cb(Fl_Widget *w, void *data)
(ve->z() - p[2]) * n[2]); (ve->z() - p[2]) * n[2]);
} }
} }
if(f.empty()) return; if(f.empty()) return;
// get options: e->modes[i]->value() if (ps->IsUPeriodic()) {
Patch* patch = new FPatch(0,ps,u,v,f,3); Patch* patchL =
patch->SetMinU(0.0); new FPatch(0,ps,u,v,f,3,(int)(e->modes[0]->value()),
patch->SetMaxU(0.5); (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));
}
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]; double LL[2], LR[2], UL[2], UR[2];
LL[0] = 0.0; LL[1] = 0.0; LL[0] = 0.0; LL[1] = 0.0;
...@@ -543,37 +803,15 @@ void compute_cb(Fl_Widget *w, void *data) ...@@ -543,37 +803,15 @@ void compute_cb(Fl_Widget *w, void *data)
GMODEL->vertexByTag(i2))); GMODEL->vertexByTag(i2)));
FM_Face* face = new FM_Face(GMODEL->numFace() + 1,patch); FM_Face* face = new FM_Face(GMODEL->numFace() + 1,patch);
face->AddEdge(eB); face->AddEdge(eR); face->AddEdge(eT); face->AddEdge(eL); face->AddEdge(eB); face->AddEdge(eR);
face->AddEdge(eT); face->AddEdge(eL);
std::list<GEdge*> l_edges; std::list<GEdge*> l_edges;
for (int j=0;j<face->GetNumEdges();j++) { for (int j=0;j<face->GetNumEdges();j++) {
int tag = face->GetEdge(j)->GetTag(); int tag = face->GetEdge(j)->GetTag();
l_edges.push_back(GMODEL->edgeByTag(tag)); l_edges.push_back(GMODEL->edgeByTag(tag));
} }
GMODEL->add(new FFace(GMODEL,face,face->GetTag(),l_edges)); 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]);
}
} }
color[0] = 0; color[1] = 0; color[2] = 1;
plotSceneViewer(0,"patch.iv",color,x,y,z,nU,nV,mask);
} }
Draw(); Draw();
... ...
......
...@@ -10,7 +10,9 @@ extern "C" { ...@@ -10,7 +10,9 @@ extern "C" {
FPatch::FPatch(int tag, ProjectionSurface* ps, FPatch::FPatch(int tag, ProjectionSurface* ps,
std::vector<double> &u, std::vector<double> &v, 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), : _coeffOriginalData(0),_coeffData(0),_coeffDerivU(0),
_coeffDerivV(0),_coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0) _coeffDerivV(0),_coeffDerivUU(0),_coeffDerivVV(0),_coeffDerivUV(0)
{ {
...@@ -19,16 +21,21 @@ FPatch::FPatch(int tag, ProjectionSurface* ps, ...@@ -19,16 +21,21 @@ FPatch::FPatch(int tag, ProjectionSurface* ps,
_tag = tag; _tag = tag;
_derivative = derivative; _derivative = derivative;
_uModes = 10; _uModes = uModes;
_vModes = 8; _vModes = vModes;
_uM = 16+1; _uM = (int)(log((double)uM) / log(2.));
_vM = 16; _vM = (int)(log((double)vM) / log(2.));
_hardEdge[0] = false; if (_ps->IsUPeriodic())
_hardEdge[1] = false; _uM++;
_hardEdge[2] = false; if (_ps->IsVPeriodic())
_hardEdge[3] = false; _vM++;
_hardEdge[0] = hardEdge0;
_hardEdge[1] = hardEdge1;
_hardEdge[2] = hardEdge2;
_hardEdge[3] = hardEdge3;
if (_ps->IsUPeriodic()) if (_ps->IsUPeriodic())
_periodicityU = 1; _periodicityU = 1;
... ...
......
#ifndef _F_PATCH_H_ #ifndef _F_PATCH_H_
#define _F_PATCH_H_ #define _F_PATCH_H_
#include <cmath>
#include <vector> #include <vector>
#include <fftw3.h> #include <fftw3.h>
#include <complex> #include <complex>
...@@ -69,7 +70,10 @@ class FPatch : public Patch { ...@@ -69,7 +70,10 @@ class FPatch : public Patch {
FPatch FPatch
(int tag, ProjectionSurface* ps, (int tag, ProjectionSurface* ps,
std::vector<double> &u, std::vector<double> &v, 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(); virtual ~FPatch();
// Abstract functions of Patch // Abstract functions of Patch
... ...
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment