TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm trying to create a signed distance function S(x), where I want to intersect S(x) = 0 with a plane. The problem is not to get the two functions into a plot, but to get the two functions to visual intersect with each other, i.e the nearest surface is in the foreground. Currently, I have something like:

      {-sqrt((x-0)^2/1 + (y-0)^2/1) + 5};

Which gives: enter image description here

As you can see, the plane is only overlapping the function and not intersecting. How can it be done? Bonus question: Is it possible to create a contour on the 3d surf plot at the intersection?

share|improve this question
Unfortunately, this can't be done with pgfplots. From the manual: "pgfplots supports z buffering techniques up to a certain extent. (...) However, it can't combine different \addplot commands, those will be drawn in the order of appearance." – Jake Apr 23 '12 at 6:26
You can use Asymptote instead, it has better 3D support. – Leo Liu Apr 23 '12 at 6:45
Thanks for the quick response! Leo, I haven't tryout Asymptote before but I think I will stick with pgfplots for now. – aagaard Apr 23 '12 at 7:20
up vote 20 down vote accepted

This can't be done automatically, unfortunately, since pgfplots can't do z buffering between different \addplot commands.

For this concrete application, you could construct the plot "by hand", however:

First, you draw the part of the cone below 0, then you draw the plane and the circle, then you draw the part of the cone above 0.

I've used a polar coordinate system for this, since it makes the input of polar functions easier:

    \begin{axis}[grid=major,view={20}{40},z buffer=sort, data cs=polar]
      \addplot3 [surf, domain=0:360, domain y=5:10,samples=30, samples y=10]
      \addplot3 [data cs=cart,surf,domain=-10:10,samples=2, opacity=0.5]
      \addplot3 [domain=0:360, samples y=0, samples=30, thick, z buffer=auto]
      \addplot3 [surf,domain=0:360, domain y=0:5,samples=30, samples y=10]
share|improve this answer
Nice alternative. In my particular case the intersection surf-plots will not be more complicated than that, so this will work for me. Thanks (also for the comment about z-buffering) – aagaard Apr 23 '12 at 7:23
Nice plot! I added it to the PGFPlots example gallery. – Stefan Kottwitz Mar 17 '14 at 11:46

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.