The Laramee Filter: pseudorandom thoughts, subsequently put on the Internet.
Tom Laramee
Date Published:
April 10th, 2021
Word Count:
2,909 (17:30 read time)
Filed Under:

RIP Sandy Hill, 1941 - 2020

Sandy and Merilee Hill At Swingside Cafe in Seattle (2005)
My Time As An Undergrad at The University of Massachusetts Amherst

When I was sophomore at UMass, I entered the Mechanical Engineering program, thinking it would eventually lead to a course in Engine Design. At the time I thought "What ME program doesn't have a course in Engine Design? / Of course they do![1]". I had spent the year before college working as a mechanic, and it always used to occur to me when repairing a car "This could really be designed much, much better."

Since I had always loved programming, I took an elective that fall semester: ECE242 Programming With Algorithms and Data Structures, taught by Professor Sandy Hill. This was not an ME course, it was under the Electrical and Computer Engineering (ECE) department.

This was a pivotal time in my life, and I was asking a lot of fundamental questions of myself. E.g.: what is a good way to be? And: who should I become? I didn't realize it at the time but I was looking for guidance, mostly in the form of role models. I wasn't sure who I wanted to become, but if I could find some examples of people who possessed the qualities I wanted to develop within myself, that would be a great starting point.

ECE242 was taught in this tiny internal room (in Marston Hall) because it was part of a remote learning program at UMass, in which the lectures were broadcast over satellite to a handful of locations, so not everyone had to be on campus. The remote "students" were mostly engineers in industry. Dr Hill used a sharpie to provide instruction on little square pieces of blue paper, which were filmed from directly above by a camera and beamed in real time over the satellite network.

I have very fond memories of his class. Unlike several of my previous professors, Sandy was incredibly patient and responded to all questions as best as he was able. He was also wonderfully charming, and never lost his cool. He had a soft-spoken voice that made it impossible to imagine him either raising his voice or yelling. When he made a mistake he'd just chuckle and say something like "Well that's not right..." and would either back up and find the mistake or just toss the paper he was working with and start over. He was patient, and methodical, and always had a warm greeting for the class. It was easy to tell that he wanted to teach[2].

I learned some really interesting things during that class. It was taught in the C programming language, so we learned the basics: structs, pointers, sorting algorithms, and linked lists. I definitely thrived in that class, and Sandy had a lot to do with that success.

Near the end of the semester, Professor Hill took a few minutes to give an overview of his graduate-level ECE660/661 Interactive Graphics Programming courses. He showed several amazing computer-rendered images and gave a 60-second overview of ray-tracing[3]. I was completely floored. Hooked. I had no viable path whatsoever to actually get into those classes, but I kept it in mind over the next few years wondering "How do I get in there?".

Fast forward to my 5th year at UMass. I was less than a year away from graduation, and as I began to test the job market I really didn't find anything that excited me. One extra-worrisome prospect was designing tubes for an air conditioning manufacturer in Connecticut. That sounded impressively uninspiring (it still does). Other prospects were companies like Pratt & Whitney (I could've used that engine design course after all) and some other DoD contractors.

So I did what any terrified undergrad does: I applied to the ECE Graduate School program at UMass.

Graduate School, Where It's Ill-Advised To Change Disciplines

I'll always believe that my application would have been denied if Sandy didn't intervene. I listed him as a reference, and my guess is they don't generally accept students with a near-zero level of prerequisite knowledge to that difficult program.

The most likely scenario is that the admissions committee was ready to toss my application, and then someone ran it by Sandy "Professor Hill, this kid listed you as a reference. He's not qualified for this program but we wanted to get your input." Sandy would have said something like "He'll be fine. Let him in."

My first semester was a rude awakening. I took a Digital Logic course, and before I could understand the graduate level homework, I'd open up the undergraduate textbook [literally] on top of the graduate textbook and then read enough to understand what needed to know just to get to the starting line of my homework.

That 1st semester, I took ECE660 and it was everything Sandy said it would be. We learned a broad array[4] of stuff, including a painstaking overview of the LZW algorithm for image compression and how to write a postscript document by hand. We began in 2D, with an orthographic projection of 3D mesh designs onto a 2D plane, and created a digital eye that we could "fly through" our 3D mesh world.

I'm fairly certain Sandy's favorite mesh was the buckyball. He had a particular enthusiasm when he introduced this object.

Incidentally, here's the list of project assignments for ECE 660:

  1. Postscript Pleasures: Generate a set of pre-defined geometric shapes using hand-written Postscript (Star of David, Yin Yang, a "polyflake", and a "meander")
  2. Chaos Capers: Write code the generate the Hailstorm Sequence, The Logistic Set, Sierpinski Gasket, Fractal Fern, and the Mandelbrot Set.
  3. Mesh Magic: Create a 3D mesh world and allow a camera "eye" to fly through the world. Add surface shading, perspective distortion, stereo mode, and a barn, shuttle, icosahedron, buckyball, and helicopter mesh.

I still have these projects, from 1994-1995. I've digitized several images and put them into galleries below.

Image Gallery for the "Postscript Pleasures" Project (ECE 660)
Postscript Bank Symbol
Postscript Symbol Variants
Postscript Yin/Yang
Postscript Meander
Source for Yin/Yang
Postscript Symbol
Postscript Polyflake
Postscript Stars
Image Gallery for the "Chaos Capers" Project (ECE 660)
Fractal Fern
Fractal Gingerbread
Serpinski Gasket
Random Image
Fat Pixel Mandelbrot Set
Mandelbrot Zoom
Project Cover Sheet
"Fat-Pixel" Mandelbrot
Hailstorm Sequence
Image Gallery for the "Magic Mesh" Project (ECE 660)
Magic Mesh Goblet
Magic Mesh Buckyball
Perspective Goblet Mesh
Shaded Goblet
Icosahedron Mesh
Shaded Icosahedron
Buckyball Faces
Shaded Buckyball
Basic Barn

The 661 class was when we got down to the serious business of writing a ray-tracer from scratch. This class was absolutely amazing, it terms of how much it taught me about graphics programming. Keep in mind that this was around the time when Pixar was best known for Luxo, the Lamp and the only computer-generated movies were very short (due to the fact that it took spectacular amounts of CPU time to render computer images back then).

We wrote some decently complex features, such as (a) mirrored surfaces (b) refraction (c) boolean objects (d) 2-D textures (checkerboard, ripple square, etc) and (e) 3-D textures (wood, marble, granite, etc).

It was around this time that I switched from programming on a Mac to using a PC[5]. The Mac (a Color Classic using the Think C compiler) was a very forgiving machine relative to the PC, which crashed early and often. Because I didn't have time to learn how to use the Borland C++ debugger, I had only two methods of debugging:

  1. Printing debug info to the console.
  2. Compute the mathematical equations by hand, using a pencil on paper, and comparing the result to what the computer was telling me.

Neither of these was particularly efficient, and I still have a clear picture, when enumerating the pixels on the screen to render a ray-traced scene, if I wanted to see what was happening from the perspective of my digital eye on my screen, the following code:

	for ( i=0; i<ROWS; i++ ) {
	  for ( j=0; j<COLS; j++ ) {
	    if ( i==DBG_ROW && j==DBG_COL ) {
	        // print debug info 
	        // for this pixel

Despite the extra work, I spent a fair amount of time with Sandy and looked forward to his class with unbridled enthusiasm twice each week.

I fell progressively further behind on the ray-tracing project as the spring semester wore on, and so during spring break, I had a rigorous routine I followed in an attempt to catch-up:

This went on seven days/week[6].

A big treat during this time was a potato burrito from La Vercruzana for dinner. I would load up on the toppings from the mini salad-bar they had, since the burrito itself was so expensive (priced at approximately $5.50), I tried to maximize the calories.

At the end of spring break, I had a stack of around 250 pages of 8"x11" printer paper with pencil computations on them. This stack represented all of the hand-rolled equations for the project up to that point (in my defense, I used the backs of other printouts and cover sheets from the engineering printer, so it wasn't like I needed a new supply of paper).

I still have printed copies of all of my source code for all of these classes. I also have my final, graded, ray-tracing project cover sheet.

Here's the cover sheet, which provides a little window into the technology zeitgeist circa 1995 (my monitor was only 256 colors with a resolution of 800x600):

My Graded Final Project From ECE661

Below is a gallery of mixed images from the ray-tracing project. The 3.5" floppy diskettes that I still have do not have any images on them, so those 256-color GIFs are likely lost to the sands of time.

ECE 660/661 Image Gallery
A Ray-Traced Scene
Many Primitives
A Ray-Traced Scene
Granite Texture
Candy Texture
A Ray-Traced Scene
Mirrored Sphere
Clear Sphere
Clear Cube
Ray-Tracing Textures
Boolean Shapes
Having Survived ECE660/661, I Get a New Advisor

Amazingly enough, Sandy became my graduate school advisor. One of my favorite semesters of graduate school was a 3-credit independent study. It was an in-depth study in object-oriented programming. My project was to write a library that could be used to create a simple 2-D drawing program on a Mac (think: lines, rectangles, ellipses, etc, with the ability to select them for scale and rotation, plus the ability to group them hierarchically and move them around).

The thing I liked most about this project was the amount of trust Sandy had in me. We only met a couple of times during the semester (and those meetings were quite brief), and then once at the very end of the semester so I could give him a quick overview. I really enjoyed working independently (which is true even today).

It was around that time that I can say I became friends with Sandy. I was invited to his house a handful of times for dinner & wine, which was when I got to know Merilee, who was always warm and inviting.

My favorite times with Sandy were when we able to "geek out" on the latest advances in computer graphics. He was incredibly curious, and we would talk about C++, object-oriented programming, the latest advances in hardware, and projects that were coming out from other universities.

It Was Time For Me To Leave Amherst

After I left UMass, I moved to Seattle to join a small technology company called Starwave. While I did get back to Amherst from time to time, these trips began to get more infrequent over the years.

For many years after I left UMass, I would send Sandy an email with the latest siggraph videos. Nobody ever understood my amazement when video games started rendering millions of polygons per second in real time, but Sandy knew exactly how cool that was. There were also a fair number of "fluid visualization" videos, plus some pseudo-random visualizations like smoke, or sand, or hair.

During my last trip to Amherst, I remember walking around downtown and it looked like a ghost town to me. There wasn't a single face I recognized (and the college kids looked so young). Plus, the center has gentrified a bit over the years and now there are even a couple of fancy-ish restaurants and a nice brew pub in Amherst center[7].

I was invited to his retirement party in Amherst and mustered up the courage to let everyone know what a huge influence he had on me, and how meeting him and taking his ECE242 class changed my career trajectory, and ultimately changed my life (a sentiment met with a collection sigh of "Awww...." from the people in attendance).

A Visit To Amherst in 2005

I also had a chance to give a short speech on the campus of UMass as part of an alumni award I received in 2013. During my time in Amherst, I stayed with Sandy and Merilee and have a chance for an extended catch-up, as I escorted Sandy to the campus center for the ceremony. For those of you who missed it, here's the video of the ceremony. It's 136MB in size and 11 minutes in duration.

I'm Left With Just A Handful of Photos of Sandy, and a Lot of Great Memories

Sandy and Merilee made one trip to Seattle in 2007. I do have a handful of photos from that time.

Sandy and Merilee At Swingside Cafe
Not Bad Sandy, Not Bad At All...

I feel like I owe him a debt of gratitude, for showing me a different way to be. When I met Sandy I had found a sort of compass, or north star, showing me a new path. Here was a guy who was a scholar and a gentleman, who was kind, thoughtful, and gentle, and who happily took time to listen, and help, and to just generally make everything better.

He was one of the most influential people in my life and I really miss him.

Author's note: I did reach out to the University late last year to explore the potential for honoring Sandy with a memorial scholarship (or similar). I'm waiting to hear back.


[0] Here's his obituary (Also a 0-based footnote so my footnotes are ANSI-C compliant)
[1] I was wrong. We never even got close.
[2] It's worth noting that it was clear that several of my professors hated teaching; they viewed it as an imposition. I'm not sure what the deal was, my theory being they were tenture-track based on quantity of publications, so all they really cared about was research (and cranking out academic papers).
[3] In so much as it's even possible to give a 60-second overview of raytracing. Professor Hill would always begin with a drawing of a tiny eye, and then draw a basic geometric shape somewhere in space, like a sphere, or a cube, or a taurus, and then would cast a single ray in the general direction of the shape.
[4] pun intended
[5] Just to date things properly, it was a dual-boot machine running Linux Slackware, which I had installed using ~25 floppy disks, inserting one after the other until the installation was complete.
[6] Which goes an awful long way to explaining why I weighed only 135 lbs when I left graduate school.
[7] One huge upside of the changes are that Amherst got it's own La Veracruzana. I used to have to drive to Northhampton for a burrito.