#include <View.H>
#include <TensorBlossom.H>
using namespace xchen;
void bspsph(View* v)
{
TensorBlossom<2,4> *sph = new TensorBlossom<2,4>(2,5, 2,8);
double w = sqrt(2.0) / 2;
E4 p(0, 1, 0, 1);
E4
p1 = p,
p2 = rZ(-45)(p).Szw(w),
p3 = rZ(-90)(p),
p4 = rZ(-135)(p).Szw(w),
p5 = rZ(-180)(p);
sph->ControlMesh() =
p1, rY(45)(p1).Syw(w), rY(90)(p1), rY(135)(p1).Syw(w), rY(180)(p1), rY(225)(p1).Syw(w),rY(270)(p1), rY(315)(p1).Syw(w),
p2, rY(45)(p2).Syw(w), rY(90)(p2), rY(135)(p2).Syw(w), rY(180)(p2), rY(225)(p2).Syw(w),rY(270)(p2), rY(315)(p2).Syw(w),
p3, rY(45)(p3).Syw(w), rY(90)(p3), rY(135)(p3).Syw(w), rY(180)(p3), rY(225)(p3).Syw(w),rY(270)(p3), rY(315)(p3).Syw(w),
p4, rY(45)(p4).Syw(w), rY(90)(p4), rY(135)(p4).Syw(w), rY(180)(p4), rY(225)(p4).Syw(w),rY(270)(p4), rY(315)(p4).Syw(w),
p5, rY(45)(p5).Syw(w), rY(90)(p5), rY(135)(p5).Syw(w), rY(180)(p5), rY(225)(p5).Syw(w),rY(270)(p5), rY(315)(p5).Syw(w);
sph->SetPeriodicEnd(0);
sph->KnotVector() =
0.,0, 1, 1, 2, 2, 3, 3, 4,
0.,0, 1, 1, 2, 2;
sph->IsRational() = true;
cout << "\n________________________________________________________________________________________________________________________";
cout << "\nSphere is \n" << *sph << endl;
new glModel(v, sph);
}
void bsp_torus(View* v)
{
TensorBlossom<1,4> *circle = new TensorBlossom<1,4>(2,8);
double w = sqrt(2.0) / 2;
E4 p(1, 0, 0, 1);
circle->ControlMesh() =
tX(2.0)*p,
(tX(2.0*w)*(rZ(45)*p)).Szw(w),
tX(2.0)*(rZ(90)*p),
(tX(2.0*w)*(rZ(135)*p)).Szw(w),
tX(2.0)*(rZ(180)*p),
(tX(2.0*w)*(rZ(225)*p)).Szw(w),
tX(2.0)*(rZ(270)*p),
(tX(2.0*w)*(rZ(315)*p)).Szw(w);
circle->IsRational() = true;
circle->SetPeriodicEnd();
circle->KnotVector() = 0.,0, 1, 1, 2, 2, 3, 3, 4;
cout << "\n________________________________________________________________________________________________________________________";
cout << "\nCircle is \n" << *circle << endl;
TensorBlossom<2,4> *torus = new TensorBlossom<2,4>(revolution, circle);
cout << "\nTorus is \n" << *torus << endl;
torus->Subdivide(2);
torus->Convert2OpenEnd();
new glModel(v, torus);
}
void bspdisk(View* v)
{
TensorBlossom<1,2> *radius = new TensorBlossom<1,2>(1,2);
radius->ControlMesh() = E2(0.001), E2(1.);
TensorBlossom<2,4> *disk = new TensorBlossom<2,4>(revolution, radius);
*disk = rX(-90) * (*disk);
disk->Subdivide(2);
disk->Convert2Bzr();
new glModel(v, disk);
}
void volume_torus(View* v)
{
TensorBlossom<1,2> *radius2 = new TensorBlossom<1,2>(1,2);
radius2->ControlMesh() = E2(0.001), E2(1.);
TensorBlossom<2,4> *disk02 = new TensorBlossom<2,4>(revolution, radius2);
*disk02 = tX(1.5) * ( rX(-90) * (*disk02));
TensorBlossom<3,4> *vtorus = new TensorBlossom<3,4>(revolution, disk02);
cout << "\n________________________________________________________________________________________________________________________";
cout << "\nVolume Torus is \n" << *vtorus << endl;
TensorBlossom<3,4> *vtorus2 = new TensorBlossom<3,4>(*vtorus);
new glModel(v, vtorus);
}
void new_glModel(View* v)
{
bspsph(v);
bsp_torus(new View);
bspdisk(new View);
volume_torus(new View);
}