If you tell my wife that she's married to a statistical geek, she'll nod knowingly. She is used to hearing sweet words of affection such as

You are more beautiful than Euler's identity.or

My love for you is like the exponential function: increasing, unbounded, and transcendental.

But those are ordinary, everyday sentiments. For Valentine's Day, I want to do something *really* special, such as formulating a parametric expression whose image is heart-shaped.
If you haven't gotten anything sweet for your special someone, you too can use SAS/IML Studio to create the following image!

Modify the program to create your own personal message. My personal message to my wife is "I love you."

/** Valentine's Day heart. Rick Wicklin: blogs.sas.com/content/iml **/ /** Parametrize in polar coordinates h(t) = (r(t), theta(t)) **/ Pi = constant("Pi"); t = do(0, 2*Pi, 0.01*Pi/4)`; r = 2 - 2*sin(t) + sin(t)#sqrt(abs(cos(t))) / (sin(t)+1.4); /** Convert to Euclidean coordinates for plotting **/ x = r#cos(t); y = r#sin(t); /** Use SAS/IML Studio to produce the image **/ declare DataObject dobj; dobj = DataObject.Create("Valentine", {"x" "y"}, x||y ); dobj.AddVar("const", j(nrow(t),1)); dobj.SetMarkerFillColor(OBS_ALL, RED); declare PolygonPlot p; p = PolygonPlot.Create(dobj, "x", "y", "const", true); p.SetGraphAreaMargins(0,0,0,0); p.SetAspectRatio(1); p.ShowAxes(false); p.SetWindowPosition(50,0,32,50); p.DrawUseDataCoordinates(); p.DrawText(0,-4.1, "r = 2 - 2*sin(t) + sin(t)*sqrt(|cos(t)|) / (sin(t)+1.4)"); p.DrawSetTextSize(30); p.DrawText(0,-0.75,"Happy\nValentine's\nDay!"J); |

## 6 Comments

While I did not understand the math, the sentiment and image was great. Your wife is a lucky woman.

Hi Rick,

See the implementation of

17 x^2 - 16|x|y + 17 y^2 =225

in wolframalpha:

http://www.wolframalpha.com/input/?i=RegionPlot%5B17+x^2-16+Abs[x]+y+%2B17+y^2%3D225,{x,+-5,5},{y,-5,5}]

Recently I use wolframalpha heavily. Wonderful tool.

Yes, thatâ€™s a good one!

Your solution implicitly defines the curve as the level set of a surface, whereas mine is a parameterized curve. I wanted my heart to have sharp points at the middle and bottom of the heart. This is easier to do with a parametric curve than with an implicitly defined curve.

Contouring algorithms often incorrectly represent the level set of a surface when the surface is tangent to the cutting plane. A classic example is the level set (x-alpha)^2-(y-beta)^2=0, which is supposed to be two lines that intersect at (alpha, beta). Contouring algorithms often represent this level set as two almost-touching hyperbolas.

Notice in your example that the implicit curve as computed by Wolfram Alpha is "rounded" at (0, +/-15/sqrt(17)), whereas a correct representation of the curve would be "pointed" there.

Well .. I'm not much of a math person ... but I read this on a bathroom stall at a rest stop between Kentucky and Tennessee in fourth grade - and it's still good! Plus I'm sure of the math.

2 lovers

+ 2 gether

---------------

4-ever

I read some other things that I won't share. But there are a lot of cheatin' boyfriends and little daVincis with magic markers out there! I'm just saying. :-)

Pingback: Belated code - SAS Users Groups

Pingback: Binary heart in SAS - The DO Loop