Ask Your Question

Parametric plot doesn't work as expected

asked 2021-04-10 16:59:16 +0200

pawel.bogdan gravatar image

updated 2021-04-11 16:13:50 +0200

slelievre gravatar image

I'm working on some visualizations. In fact, I'd like to vizualize lines and curves on the projective plane. I started with something very easy: draw a line on sphere. I figured out the following.

Compute intersection of a plane with the unit sphere:

sage: x, y, z = var('x y z')
sage: sol = solve([x + y + z == 0.0, x^2 + y^2 + z^2 == 1.0], y, z)
sage: sol
[[y == -1/2*x - 1/2*sqrt(-3*x^2 + 2), z == -1/2*x + 1/2*sqrt(-3*x^2 + 2)],
 [y == -1/2*x + 1/2*sqrt(-3*x^2 + 2), z == -1/2*x - 1/2*sqrt(-3*x^2 + 2)]]

Draw the plane, the sphere, and their intersection:

sage: p = implicit_plot3d(x + y + z, (x, -5, 5), (y, -5, 5), (z, -5, 5), color="blue", opacity=0.2)
sage: p += implicit_plot3d(x^2 + y^2 + z^2 - 1, (x, -5, 5), (y, -5, 5), (z, -5, 5), color="red", opacity=0.4)
sage: for s in sol: 
....:     p += parametric_plot3d([x, y.subs(s[0]), z.subs(s[1])], (x, -5.0, 5.0), color="green")
sage: show(p)

Plane, sphere and their intersection

I believe the computation is correct.

However I'm not satisfied with the resulting plot. Instead of a smooth line (like a tilted equator) I have strange "triangles" at opposite points of the sphere.

What can I do about it?

edit retag flag offensive close merge delete


Here is the result I was writing about: (pict)

pawel.bogdan gravatar imagepawel.bogdan ( 2021-04-10 16:59:51 +0200 )edit

1 Answer

Sort by ยป oldest newest most voted

answered 2021-04-10 19:53:34 +0200

vdelecroix gravatar image

Your computation is somehow wrong. It comes from the formula sqrt(-3*x^2 + 2) that is valid only in a certain range of x. Here you let x run from -5 to 5 and you will have negative numbers inside the sqrt such as

sage: sqrt(-3*5**2 + 2)

I find it curious that you still get a picture.

edit flag offensive delete link more


Thank you very much, for your suggestion! I fixed my example code:

x,y,z=var('x y z')
sol = solve([x+y+z==0.0, x^2+y^2+z^2 == 1.0], y, z);
# p = implicit_plot3d(x+y+z, (x,-5,5), (y,-5,5), (z,-5,5), color="blue", opacity=0.2)
p = implicit_plot3d(x^2+y^2+z^2 - 1,(x,-5,5), (y,-5,5), (z,-5,5), color="red", opacity=0.4)
for s in sol: 
    p += parametric_plot3d([x,y.subs(s[0]), z.subs(s[1])], (x,-1/3*sqrt(3)*sqrt(2), 1/3*sqrt(3)*sqrt(2)), color="green")

And now the result is satisfying. I'm wondering if there is a way to automatize this kind of calculations

pawel.bogdan gravatar imagepawel.bogdan ( 2021-04-10 23:48:08 +0200 )edit

negative numbers inside the [square root] [...] I find it curious that you still get a picture

I wonder whether this might be related to:

slelievre gravatar imageslelievre ( 2021-04-13 21:15:53 +0200 )edit

I'm wondering if there is a way to automate this kind of calculations

One might walk the expression tree for each solved variable, list things things that must be nonnegative or positive by detecting arguments of square roots and logarithms, and find the correct plotting intervals that way.

slelievre gravatar imageslelievre ( 2021-04-13 23:27:02 +0200 )edit

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


Asked: 2021-04-10 16:59:16 +0200

Seen: 333 times

Last updated: Apr 11 '21