#5511: arbitrary mesh functions
-------------------------+--------------------------------------------------
 Reporter:  jason        |       Owner:  was       
     Type:  enhancement  |      Status:  new       
 Priority:  major        |   Milestone:  sage-3.4.1
Component:  graphics     |    Keywords:            
-------------------------+--------------------------------------------------

Old description:

> The following worksheet implements arbitrary mesh functions for 3d
> graphics objects that are triangulated.  This could probably ought to go
> into sage somewhere:
>
> Arbitrary Mesh Functions
> system:sage
>
> {{{id=15|
> from sage.ext.fast_eval import fast_float
> ///
> }}}
>
> <p>Simple bisection root finder for a function of 3 variables.</p>
>
> {{{id=16|
> %hide
> %auto
> %cython
>
> cpdef find_root(f, double target, point_1, point_2, double epsilon=1e-4):
>     """
>     Given two 3d points point_1 and point_2, find a point (x,y,z) on the
> segment between them where abs(f(x,y,z)-target)<=epsilon.
>
>     Returns (x,y,z) if the point lies on the segment between point_1 and
> point_2 and satisfies the above inequality, otherwise returns None.
>
>     The code assumes the function f is continuous.
>     """
>     cdef double s0,s1,s2
>     cdef double e0,e1,e2
>     cdef double new_0,new_1,new_2
>     cdef double target_0 = target-epsilon
>     cdef double target_1 = target+epsilon
>     cdef double val
>     cdef int i
>
>     cdef double min = f(*point_1)
>     cdef double max = f(*point_2)
>     s0,s1,s2 = point_1
>     e0,e1,e2 = point_2
>     if min>max:
>         min,max=max,min
>         s0,s1,s2,e0,e1,e2 = e0,e1,e2,s0,s1,s2
>     # Check to see if one of the endpoints satisfies it
>     if target_0<=min and min<=target_1:
>         return (s0,s1,s2)
>     if target_0<=max and max<=target_0:
>         return (e0,e1,e2)
>     if min>target_1 or max<target_0:
>         return None
>     i=0
>     while True:
>         if i>100:
>             return None
>         else:
>             i+=1
>         # Get half-way point
>         new_0 = s0+(e0-s0)/2.0
>         new_1 = s1+(e1-s1)/2.0
>         new_2 = s2+(e2-s2)/2.0
>         val = f(new_0, new_1, new_2)
>         if val<target_0:
>             s0, s1, s2 = new_0, new_1, new_2
>             min = val
>         elif target_1<val:
>             e0, e1, e2 = new_0, new_1, new_2
>             max=val
>         else:
>             return (new_0,new_1,new_2)
> ///
> }}}
>
> {{{id=24|
>
> ///
> }}}
>
> {{{id=41|
> def calculate_crossing(f,target,v0,v1,vertices, cache_dict):
>     """
>     Calculate, for an edge (v0,v1), where f is "close" to target.  Use
> cache_dict to cache the values.
>     """
>     # Make a canonical ordering of the vertices since (v0,v1) is the same
> edge as (v1,v0)
>     if v0>v1:
>         v0,v1=v1,v0
>     if (v0,v1) in cache_dict:
>         return cache_dict[(v0,v1)]
>     else:
>         pt = find_root(f, target, vertices[v0], vertices[v1])
>         cache_dict[(v0,v1)]=pt
>         return pt
> ///
> }}}
>
> {{{id=34|
> %time
> var('x,y,z')
> p=parametric_plot((x,y,9-x^2-y^2), (x,-3,3), (y,-3,3), mesh=True)
> f=x^2-sin(x*y^2)+cos(z)
> ff=fast_float(f, 'x', 'y','z')
> p.triangulate()
> vertices=p.vertex_list()
>
> # I am still calculating the function on each vertex multiple times; that
> could be optimized
> # vertex_values=[ff(*v) for v in vertices]
>
> mesh=[]
> for target in [0,2,..,20]:
>     cache={}
>     for face in [f+[f[0]] for f in p.index_faces()]:
>         # Adding the [0] takes care of the edge from vertices[0] to
> vertices[-1]
>         pts = [calculate_crossing(ff,target,face[i],
> face[i+1],vertices=vertices, cache_dict=cache) for i in
> range(len(face)-1)]
>         pts = [i for i in pts if i is not None]
>         mesh+=[line([pt1,pt2],thickness=3, color='black') for pt1,pt2 in
> Subsets(pts, 2)]
> ///
>
> CPU time: 0.91 s,  Wall time: 1.26 s
> }}}
>
> {{{id=39|
> p+sum(mesh)
> ///
> }}}
>
> {{{id=42|
> (p+sum(mesh)).show(viewer='tachyon')
> ///
> }}}
>
> {{{id=44|
>
> ///
> }}}
>
> {{{id=45|
>
> ///
> }}}

New description:

 The attached worksheet implements and illustrates arbitrary mesh functions
 for 3d graphics objects that are triangulated.  This could probably ought
 to go into sage somewhere.

--

Comment(by jason):

 Boy, that was all mes

-- 
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/5511#comment:1>
Sage <http://sagemath.org/>
Sage - Open Source Mathematical Software: Building the Car Instead of 
Reinventing the Wheel

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sage-trac?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to