#ifndef VOROPP_WALL_HH
#define VOROPP_WALL_HH
#include "cell.hh"
#include "container.hh"
namespace voro {
struct wall_sphere : public wall {
public:
wall_sphere(double xc_,double yc_,double zc_,double rc_,int w_id_=-99)
: w_id(w_id_), xc(xc_), yc(yc_), zc(zc_), rc(rc_) {}
bool point_inside(double x,double y,double z);
template<class v_cell>
bool cut_cell_base(v_cell &c,double x,double y,double z);
bool cut_cell(voronoicell &c,double x,double y,double z) {return cut_cell_base(c,x,y,z);}
bool cut_cell(voronoicell_neighbor &c,double x,double y,double z) {return cut_cell_base(c,x,y,z);}
private:
const int w_id;
const double xc,yc,zc,rc;
};
struct wall_plane : public wall {
public:
wall_plane(double xc_,double yc_,double zc_,double ac_,int w_id_=-99)
: w_id(w_id_), xc(xc_), yc(yc_), zc(zc_), ac(ac_) {}
bool point_inside(double x,double y,double z);
template<class v_cell>
bool cut_cell_base(v_cell &c,double x,double y,double z);
bool cut_cell(voronoicell &c,double x,double y,double z) {return cut_cell_base(c,x,y,z);}
bool cut_cell(voronoicell_neighbor &c,double x,double y,double z) {return cut_cell_base(c,x,y,z);}
private:
const int w_id;
const double xc,yc,zc,ac;
};
struct wall_cylinder : public wall {
public:
wall_cylinder(double xc_,double yc_,double zc_,double xa_,double ya_,double za_,double rc_,int w_id_=-99)
: w_id(w_id_), xc(xc_), yc(yc_), zc(zc_), xa(xa_), ya(ya_), za(za_),
asi(1/(xa_*xa_+ya_*ya_+za_*za_)), rc(rc_) {}
bool point_inside(double x,double y,double z);
template<class v_cell>
bool cut_cell_base(v_cell &c,double x,double y,double z);
bool cut_cell(voronoicell &c,double x,double y,double z) {return cut_cell_base(c,x,y,z);}
bool cut_cell(voronoicell_neighbor &c,double x,double y,double z) {return cut_cell_base(c,x,y,z);}
private:
const int w_id;
const double xc,yc,zc,xa,ya,za,asi,rc;
};
struct wall_cone : public wall {
public:
wall_cone(double xc_,double yc_,double zc_,double xa_,double ya_,double za_,double ang,int w_id_=-99)
: w_id(w_id_), xc(xc_), yc(yc_), zc(zc_), xa(xa_), ya(ya_), za(za_),
asi(1/(xa_*xa_+ya_*ya_+za_*za_)),
gra(tan(ang)), sang(sin(ang)), cang(cos(ang)) {}
bool point_inside(double x,double y,double z);
template<class v_cell>
bool cut_cell_base(v_cell &c,double x,double y,double z);
bool cut_cell(voronoicell &c,double x,double y,double z) {return cut_cell_base(c,x,y,z);}
bool cut_cell(voronoicell_neighbor &c,double x,double y,double z) {return cut_cell_base(c,x,y,z);}
private:
const int w_id;
const double xc,yc,zc,xa,ya,za,asi,gra,sang,cang;
};
}
#endif