Mathematics Stack Exchange is a question and answer site for people studying math at any level and professionals in related fields. Join them; it only takes a minute:

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


Looking to create interesting video transitions (in grayscale).


Given equations that represent a closed, symmetrical shape, plot the outline and concentrically shade the shape towards its centre.


Consider the following equations:

x = 16 * sin(t)^3
y = 13 * cos(t) - 5 * cos(2 * t) - 2 * cos(3 * t) - cos(4 * t)
t = [0:2 * pi]

When plotted:

When shaded, it would resemble (not shown completely shaded, but sufficient to show the idea):

Notice that shading is darkest on the outside (e.g., #000000 RGB hex), then lightens as it fills to the centre. The centre would be a white (e.g., #FFFFFF) dot.


  1. What would be the most expedient way to produce high-resolution, concentrically shaded grayscale images, such as the shaded heart above?
  2. What are such closed, symmetrical shapes formally called?

Thank you!


  • Use GNUPlot
  • Use R
share|cite|improve this question
I'm not sure how to implement it, but I am imagining defining a function on the plane that is 0 outside the region, and some sublinear function of the distance to the origin within the region, then doing a density plot of it in Mathematica (or its equivalent in another program). – Zev Chonoles Jul 1 '11 at 2:51
@Zev: I think ParametricPlot[ k {16 Sin[t]^3, 13 Cos[t] - 5 Cos[2 t] - 2 Cos[3 t] - Cos[4 t]}, {t, 0, 2 \[Pi]}, {k, 0, 1}, Axes -> None, Mesh -> False, ColorFunction -> Function[{x, y, t, k}, GrayLevel[ 1 - Norm[{x, y}]/ Norm[{16 Sin[t]^3, 13 Cos[t] - 5 Cos[2 t] - 2 Cos[3 t] - Cos[4 t]}]]], ColorFunctionScaling -> False, BoundaryStyle -> None, Frame -> None] does what you intended, more or less, and seems to look exactly like my first attempt. – Isaac Jul 1 '11 at 3:58
up vote 2 down vote accepted

I suspect this is not quite what you're looking for*, but my first idea was to draw line segments from some central point, such as the origin, to various points on the curve, shading the line segment from white at the central end to black at the curve end. Here is the Mathematica code and the result for your heart-shaped curve, using the origin as the central point, and drawing line segments for $t$ from $0$ to $2\pi$ in steps of $\frac{\pi}{1200}$:

  Line[{{0, 0}, {16 Sin[t]^3, 
     13 Cos[t] - 5 Cos[2 t] - 2 Cos[3 t] - Cos[4 t]}}, 
   VertexColors -> {White, Black}], {t, 0, 2 \[Pi], \[Pi]/1200}]]

shaded heart via gradient line segments

* I don't think this is what you're looking for particularly because I don't think it's all that expedient; beyond that, I wouldn't call this concentrically-shaded, exactly, either; also, I have no idea what such shapes are formally called.

Here's a second thought, which is to graph your curve in $k\%$ black, scaled by a factor of $k\%$. Again, here's Mathematica code and the result with 400 steps from black to white (I don't know what's causing the diagonal line artifacts):

  ParametricPlot[(1 - k) {16 Sin[t]^3, 
     13 Cos[t] - 5 Cos[2 t] - 2 Cos[3 t] - Cos[4 t]}, {t, 0, 2 \[Pi]},
    PlotStyle -> GrayLevel[k], Axes -> None], {k, 0, 1, 0.0025}]]

shaded heart via dilated copies of the curve

share|cite|improve this answer
@Dave: The first method you could probably do in any system that will let you draw a set of line segments colored from white at one end to black at the other. The second method should work in any graphing application that can do parametric graphing with 2 parameters and set the coloring scheme. I'd think GNUplot might be able to do it, but I've never really used GNUplot. – Isaac Jul 1 '11 at 4:06

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.