Processing math: 100%

First time here? Check out the FAQ!

Ask Your Question
3

How to plot projections of a 3D surface onto coordinate planes?

asked 4 years ago

Abby11 gravatar image

For the function F=F(x,y), we can plot the function in 3-dimensions by choosing z=F(x,y) which represents a surface. I require to plot the following projections:

  1. The projection of the surface F(x,y) on the xz-plane and on the yz-plane.
  2. The projection of the extremas of F(x,y) on the xz-plane and on the yz-plane.

I am new to SageMath and learning the basics. Can someone help me how to plot the projections?

Thanks!

Preview: (hide)

1 Answer

Sort by » oldest newest most voted
4

answered 4 years ago

Juanjo gravatar image

Consider the following code:

from sage.plot.plot3d.index_face_set import IndexFaceSet
from sage.plot.plot3d.texture import Texture

def project_xy_xz_yz(surf, position):
    oxy,oxz,oyz = position

    # Initialize surf as an IndexFaceSet
    surf.triangulate()

    # Vertices projected onto planes parallel to xy, xz and yz
    vxy_list = [(v[0],v[1],oxy) for v in surf.vertices()]
    vxz_list = [(v[0],oxz,v[2]) for v in surf.vertices()]
    vyz_list = [(oyz,v[1],v[2]) for v in surf.vertices()]

    # Compute projections. We have to consider whether or not
    # each face has its own color
    f_list = surf.index_faces()
    if surf.has_local_colors():
        f_data = surf.index_faces_with_colors()
        col_list = [Texture(color=item[1]) for item in f_data]
        pxy = IndexFaceSet(f_list,vxy_list,texture_list=col_list)
        pxz = IndexFaceSet(f_list,vxz_list,texture_list=col_list)
        pyz = IndexFaceSet(f_list,vyz_list,texture_list=col_list)
    else:
        texture = surf.get_texture()
        pxy = IndexFaceSet(f_list,vxy_list)
        pxy.set_texture(texture)
        pxz = IndexFaceSet(f_list,vxz_list)
        pxz.set_texture(texture)
        pyz = IndexFaceSet(f_list,vyz_list)
        pyz.set_texture(texture)

    # End function
    return [pxy, pxz, pyz]

This code defines a function, project_xy_xz_yz, which computes the projection of a surface, given by the first argument, onto planes parallel to the xy, xz and yzplanes. Specifically, if the second argument is [a,b,c], we get the projections onto the planes z=a, y=b and x=c. The functions used in the code are mostly documented here.

Let us test this function. Let us consider the surface z=2x+3y2(x2+y2+1)2 and plot it in the rectangle [2,2]×[2,2]. First, the surface will have a uniform color and will be a bit transparent. We add the projections onto planes parallel to xz and yz, which inherit the surface color. The orthographic projection will allow you to check that the projections match the surface.

var("x,y")
def f(x,y):
    return (2*x+3*y^2) / (x^2+y^2+1)^2

s1 = plot3d(f(x,y), (x,-2,2), (y,-2,2), color="lightgreen", opacity=0.6)
p1 = project_xy_xz_yz(s1,[-1,-3,-3])
show(s1+p1[1]+p1[2], aspect_ratio=[1,1,2], projection="orthographic")

image description

Now, let us get a full color picture and the three projections. Note that you can freely choose where locate the projection planes.

z1, z2 = -0.6, 0.8
def col(x,y):
    return float((f(x,y)-z1)/(z2-z1))

s2 = plot3d(f(x,y), (x,-2,2), (y,-2,2), color=(col,colormaps.coolwarm), plot_points=80)
p2 = project_xy_xz_yz(s2,[-1,3,3])
show(s2+sum(p2), aspect_ratio=[1,1,2], frame=False)

image description

I think that the function extrema are easily seen in the projections.

You can play this examples in this SageMath cell.

Preview: (hide)
link

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 4 years ago

Seen: 1,586 times

Last updated: May 28 '20