Author: eudoxos
Date: 2009-06-17 17:47:48 +0200 (Wed, 17 Jun 2009)
New Revision: 1803

Modified:
   trunk/gui/py/_packPredicates.cpp
   trunk/gui/py/pack.py
   trunk/scripts/test/regular-sphere-pack.py
Log:
Anton's new things: axis-aligned ellipsoid predicate and fix in 
pack.regularHexa.

I added elliptical leg to the sample script and mouth as cylinder. The reason 
is that
critical timestep depends (also) on the minimum sphere size, therefore the 
simulation
would run slower...



Modified: trunk/gui/py/_packPredicates.cpp
===================================================================
--- trunk/gui/py/_packPredicates.cpp    2009-06-17 12:49:09 UTC (rev 1802)
+++ trunk/gui/py/_packPredicates.cpp    2009-06-17 15:47:48 UTC (rev 1803)
@@ -110,6 +110,32 @@
        }
 };
 
+/* Axis-aligned ellipsoid predicate */
+class inEllipsoid{
+       Vector3r c, abc;
+public:
+       inEllipsoid(python::tuple _c, python::tuple _abc)
+               {c=tuple2vec(_c); abc=tuple2vec(_abc);}
+       bool operator()(python::tuple _pt, Real pad=0.){
+               Vector3r pt=tuple2vec(_pt);
+               
+               //Define the ellipsoid X-coordinate of given Y and Z
+               Real x = 
sqrt((1-pow((pt[1]-c[1]),2)/((abc[1]-pad)*(abc[1]-pad))-pow((pt[2]-c[2]),2)/((abc[2]-pad)*(abc[2]-pad)))*((abc[0]-pad)*(abc[0]-pad)))+c[0];
 
+               Vector3r edgeEllipsoid(x,pt[1],pt[2]); // create a vector of 
these 3 coordinates
+               
+               if ((pt-c).Length()<=(edgeEllipsoid-c).Length()) { //check 
whether given coordinates lie inside ellipsoid or not
+                       return true;
+               } else {
+                       return false;
+               }
+       }
+       python::tuple aabb(){
+               Vector3r& center(c); Vector3r& ABC(abc);
+               return 
vvec2ttuple(Vector3r(center[0]-ABC[0],center[1]-ABC[1],center[2]-ABC[2]),Vector3r(center[0]+ABC[0],center[1]+ABC[1],center[2]+ABC[2]));
+       }
+};
+
+
 BOOST_PYTHON_MODULE(_packPredicates){
        boost::python::class_<inSphere>("inSphere","Sphere 
predicate.",python::init<python::tuple,Real>(python::args("center","radius"),"Ctor
 taking center (as a 3-tuple) and radius"))
                .def("__call__",&inSphere::operator(),"Tell whether given point 
lies within this sphere, still having 'pad' space to the solid 
boundary").def("aabb",&inSphere::aabb,"Return minimum and maximum values for 
AABB");
@@ -119,5 +145,7 @@
                .def("__call__",&inCylinder::operator(),"Tell whether given 
point lies within this cylinder, still having 'pad' space to the solid 
boundary").def("aabb",&inCylinder::aabb,"Return minimum and maximum values for 
AABB");
        boost::python::class_<inHyperboloid>("inHyperboloid","Hyperboloid 
predicate",python::init<python::tuple,python::tuple,Real,Real>(python::args("centerBottom","centerTop","radius","skirt"),"Ctor
 taking centers of the lateral walls (as 3-tuples), radius at bases and skirt 
(middle radius)."))
                .def("__call__",&inHyperboloid::operator(),"Tell whether given 
point lies within this hyperboloid, still having 'pad' space to the solid 
boundary\n(not accurate, since distance perpendicular to the axis, not the 
surface, is taken in account)").def("aabb",&inHyperboloid::aabb,"Return minimum 
and maximum values for AABB");
+       boost::python::class_<inEllipsoid>("inEllipsoid","Ellipsoid 
predicate",python::init<python::tuple,python::tuple>(python::args("centerPoint","abc"),"Ctor
 taking center of the ellipsoid (3-tuple) and its 3 radii (3-tuple)."))
+               .def("__call__",&inEllipsoid::operator(),"Tell whether given 
point lies within this inEllipsoid").def("aabb",&inEllipsoid::aabb,"Return 
minimum and maximum values for AABB");
 }
 

Modified: trunk/gui/py/pack.py
===================================================================
--- trunk/gui/py/pack.py        2009-06-17 12:49:09 UTC (rev 1802)
+++ trunk/gui/py/pack.py        2009-06-17 15:47:48 UTC (rev 1803)
@@ -24,7 +24,7 @@
        h=a*sqrt(3)/2.
        mn,mx=predicate.aabb()
        dim=[mx[i]-mn[i] for i in 0,1,2]
-       
ii,jj,kk=[range(0,int(2*dim[0]/a)+1),range(0,int(dim[1]/h)+1),range(0,int(dim[2]/h)+1)]
+       
ii,jj,kk=[range(0,int(dim[0]/a)+1),range(0,int(dim[1]/h)+1),range(0,int(dim[2]/h)+1)]
        for i,j,k in itertools.product(ii,jj,kk):
                x,y,z=mn[0]+radius+i*a,mn[1]+radius+j*h,mn[2]+radius+k*h
                if j%2==0: x+= a/2. if k%2==0 else -a/2.

Modified: trunk/scripts/test/regular-sphere-pack.py
===================================================================
--- trunk/scripts/test/regular-sphere-pack.py   2009-06-17 12:49:09 UTC (rev 
1802)
+++ trunk/scripts/test/regular-sphere-pack.py   2009-06-17 15:47:48 UTC (rev 
1803)
@@ -8,13 +8,14 @@
        
pack.regularHexa(pack.inSphere((0,0,4),2),radius=rad,gap=gap,color=(0,1,0),density=10*rho)
 # head
        
+[utils.sphere((.8,1.9,5),radius=.2,color=(.6,.6,.6),density=rho),utils.sphere((-.8,1.9,5),radius=.2,color=(.6,.6,.6),density=rho),utils.sphere((0,2.4,4),radius=.4,color=(1,0,0),density=rho)]
 # eyes and nose
        +[utils.facet([(12,0,-6),(0,12,-6,),(-12,-12,-6)],dynamic=False)] # 
ground
+       
+pack.regularHexa(pack.inCylinder((-1,2.2,3.3),(1,2.2,3.3),2*rad),radius=rad,gap=gap/3,color=(0.929,0.412,0.412),density=10*rho)
 #mouth
 )
 
 for part in [
        pack.regularHexa 
(pack.inAlignedBox((-2,-2,-2),(2,2,2)),radius=1.5*rad,gap=2*gap,color=(1,0,1),**kw),
 # body,
-       
pack.regularOrtho(pack.inCylinder((-1,0,-2),(-1,0,-6),1),radius=rad,gap=gap,color=(0,1,1),**kw),
 # left leg
+       
pack.regularOrtho(pack.inEllipsoid((-1,0,-4),(1,1,2)),radius=rad,gap=0,color=(0,1,1),**kw),
 # left leg
        pack.regularHexa 
(pack.inCylinder((+1,1,-2.5),(0,3,-5),1),radius=rad,gap=gap,color=(0,1,1),**kw),
 # right leg
-       pack.regularHexa 
(pack.inHyperboloid((+2,0,1),(+6,0,1),1,.5),radius=rad,gap=gap,color=(0,0,1),**kw),
 # right hand
+       pack.regularHexa 
(pack.inHyperboloid((+2,0,1),(+6,0,0),1,.5),radius=rad,gap=gap,color=(0,0,1),**kw),
 # right hand
        
pack.regularOrtho(pack.inCylinder((-2,0,2),(-5,0,4),1),radius=rad,gap=gap,color=(0,0,1),**kw)
 # left hand
        ]: O.bodies.appendClumped(part)
 


_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to