00001
00002
00003
00004
00005
00006
00007 #include "wall.hh"
00008
00009
00010
00011
00012 bool wall_sphere::point_inside(fpoint x,fpoint y,fpoint z) {
00013 return (x-xc)*(x-xc)+(y-yc)*(y-yc)+(z-zc)*(z-zc)<rc*rc;
00014 }
00015
00016
00017
00018
00019
00020
00021
00022
00023 template<class n_option>
00024 inline bool wall_sphere::cut_cell_base(voronoicell_base<n_option> &c,fpoint x,fpoint y,fpoint z) {
00025 fpoint xd=x-xc,yd=y-yc,zd=z-zc,dq;
00026 dq=xd*xd+yd*yd+zd*zd;
00027 if (dq>1e-5) {
00028 dq=2*(sqrt(dq)*rc-dq);
00029 return c.nplane(xd,yd,zd,dq,w_id);
00030 }
00031 return true;
00032 }
00033
00034
00035
00036
00037 bool wall_plane::point_inside(fpoint x,fpoint y,fpoint z) {
00038 return x*xc+y*yc+z*zc<ac;
00039 }
00040
00041
00042
00043
00044
00045 template<class n_option>
00046 inline bool wall_plane::cut_cell_base(voronoicell_base<n_option> &c,fpoint x,fpoint y,fpoint z) {
00047 fpoint dq=2*(ac-x*xc-y*yc-z*zc);
00048 return c.nplane(xc,yc,zc,dq,w_id);
00049 }
00050
00051
00052
00053
00054 bool wall_cylinder::point_inside(fpoint x,fpoint y,fpoint z) {
00055 fpoint xd=x-xc,yd=y-yc,zd=z-zc;
00056 fpoint pa=(xd*xa+yd*ya+zd*za)*asi;
00057 xd-=xa*pa;yd-=ya*pa;zd-=za*pa;
00058 return xd*xd+yd*yd+zd*zd<rc*rc;
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 template<class n_option>
00070 inline bool wall_cylinder::cut_cell_base(voronoicell_base<n_option> &c,fpoint x,fpoint y,fpoint z) {
00071 fpoint xd=x-xc,yd=y-yc,zd=z-zc;
00072 fpoint pa=(xd*xa+yd*ya+zd*za)*asi;
00073 xd-=xa*pa;yd-=ya*pa;zd-=za*pa;
00074 pa=xd*xd+yd*yd+zd*zd;
00075 if(pa>1e-5) {
00076 pa=2*(sqrt(pa)*rc-pa);
00077 return c.nplane(xd,yd,zd,pa,w_id);
00078 }
00079 return true;
00080 }
00081
00082
00083
00084
00085 bool wall_cone::point_inside(fpoint x,fpoint y,fpoint z) {
00086 cout << x << y << z << endl;
00087 fpoint xd=x-xc,yd=y-yc,zd=z-zc;
00088 fpoint pa=(xd*xa+yd*ya+zd*za)*asi;
00089 xd-=xa*pa;yd-=ya*pa;zd-=za*pa;
00090 pa*=gra;
00091 if (pa<0) return false;
00092 pa*=pa;
00093 return xd*xd+yd*yd+zd*zd<pa;
00094 }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104 template<class n_option>
00105 inline bool wall_cone::cut_cell_base(voronoicell_base<n_option> &c,fpoint x,fpoint y,fpoint z) {
00106 fpoint xd=x-xc,yd=y-yc,zd=z-zc;
00107 fpoint xf,yf,zf,imoda;
00108 fpoint pa=(xd*xa+yd*ya+zd*za)*asi;
00109 xd-=xa*pa;yd-=ya*pa;zd-=za*pa;
00110 pa=xd*xd+yd*yd+zd*zd;
00111 if(pa>1e-5) {
00112 pa=1/sqrt(pa);
00113 imoda=sqrt(asi);
00114 xf=-sang*imoda*xa+cang*pa*xd;
00115 yf=-sang*imoda*ya+cang*pa*yd;
00116 zf=-sang*imoda*za+cang*pa*zd;
00117 pa=2*(xf*(xc-x)+yf*(yc-y)+zf*(zc-z));
00118 return c.nplane(xf,yf,zf,pa,w_id);
00119 }
00120 return true;
00121 }