When I was a student (both undergrad/grad), I wrote a lot of educational web tutorials on a diverse array of topics as a hobby. Some of these articles began in classes I took when I was an undergraduate at Princeton University, and some of them were written for fun on my own time. Many of them remain popular to this day, so I am archiving them here. All math is displayed in LaTeX using the jsMath plugin. Code is displayed using Alex Gorbatchev's SyntaxHighlighter. And comments are served by DISQUS.

Computer Graphics / Vision

Basic Image Processing Techniques

Last Updated 2/18/2009
This was the first assignment I did for my computer graphics class when I was a sophomore in college. The explanations are a little bit sparse but there are lots of pretty pictures.

Edge, Corner, and Blob Detection

Last Updated 10/6/2009
This tutorial explains the math behind Canny Edge detection, corner detection, and basic blob detection: three extremely important algorithms at the heart of computer vision.

Seam Carving

Last Updated 9/18/2011
This tutorial explains a relatively simple technique for "content-aware image resizing." The algorithm attempts to find "less important" regions of an image and delete them first, so that an image doesn't get uniformly blurred before getting resized. As such, it does a much better job preserving important details after resizing. This technique can also be used to remove unwanted objects from an image.

Image Analogies

Last Updated 10/12/2010
I explain an amazing technique that came out of the NYU graphics group that does the following: Given two images A and A' with some relationship between them, start with an image B and synthesize an image B' from scratch that has the same relationship. For instance, if A' is a blurred version of A, B' should be a blurred version of B. There possibilities are endless. (This was the first assignment for a graduate computer graphics class I took as a Princeton senior)

Poisson Image Editing

Last Updated 3/25/2012
This is a tutorial I wrote about a technique to seamlessly blend images together fully automatically. The heart of the algorithm rests on a very simple idea that I've attempted to explain as clearly as I can for an audience that may be a bit rusty on math. Best of all, I made an interactive Java applet that lets people try the technique out. My hope is that this program will allow just about anyone to do wacky things with images on their own desktop, even if they aren't interested in understanding exactly how it works.

Try It Out Yourself!


Automatic Background/Foreground Segmentation in Videos

Last Updated 1/11/2011
This tutorial presents two different algorithms to automatically segment foreground and background objects in video. One technique uses a mixture of Gaussians, while the other technique uses information in the frequency domain. (This was my final project for a senior year image processing class at Princeton)

SOURCE CODE (Visual C++ 2008)

3D Shape Matching

Last Updated 11/21/2010
Given a 3D shape, this tutorial explains how to find the "most similar" shape in a database of pre-defined shapes. It uses machine learning techniques based off of "shape descriptors," which try to capture some of the geometry of a shape in a vector. It also introduces "precision-recall" graphs, a useful and more general technique for analyzing how well machine learning algorithms work. This tutorial is closely related to my senior thesis at Princeton, which was to analyze a novel 3D shape descriptor for point clouds in cities.

Laplacian Mesh Editing

Last Updated 10/30/2010
This tutorial talks about how to move one vertex on a 3D mesh away from its original position and to have the mesh bend and stretch gracefully to accomadate this change. (This was the second assignment for a graduate computer graphics class I took as a Princeton senior)

Mesh Segmentation Using KMeans Clustering

Last Updated 11/29/2010
I present a simple technique used to automatically divide 3D surfaces up into smaller parts that have semantic meaning. (This was the third assignment for a graduate computer graphics class I took as a Princeton senior)

Digital Signal Processing / Acoustics

Composing with Risset Beats

Last Updated 3/10/2009
This is a fun little project that explains how it's possible to make music with "beats," or the sounds that result when two notes are really close to each other in frequency. Source code included.

Click here for Michael Jackson's "Wanna Be Startin Somethin" synthesized with my Risset Beats program.

Simulating 3D Sound with Image Sources

Last Updated 1/18/2011
This was part of a final project for my advanced computer graphics class back at Princeton. My partner Ken Jenkins and I made this 3D sound simulator from scratch to simulate specular sound reflection, diffraction, and transmission that are all frequency-dependent. The tutorial links to a page of results (which are really cool IMHO), but we didn't have time to write up a really good tutorial to explain the math to total beginners. The best I can do for now is link to our technical writeup, which is a little bit sparse. But I will definitely be revisiting some of these concepts as I conduct my graduate research here at Duke.


The Regular Tetrahedron

Last Updated 6/22/2011
A very small tutorial I wrote using vector geometry to show that the angles between molecules arranged on the regular tetrahedron are approximately 109.5 degrees

Kinect Disparity to Depth Conversion

Last Updated 1/29/2014
An excerpt from a paper I never published that explains the geometry behind converting from a raw "disparity map" (the unprocessed stereo correspondences sent back from the Kinect) to 3D depth coordinates, assuming a distortionless pinhole camera model.


Taylor Series

Last Updated 9/19/2010
A light introduction to Taylor Series. I derive it from a differential and integral point of view, I show how to estimate the remainder term, and I give lots of examples, including how to approximate the square root of two and why small angle approximation works. Hopefully an intuitive and clear explanation of Taylor Series for people who are confused about it or who have never seen it before

Euler's Formula

Last Updated 5/19/2010
A short tutorial on Euler's Formula, which ties exponentials to sinusoids through imaginary numbers. A very important prerequisite to signal processing

Implicit Multivariable Differentiation

Last Updated 3/25/2012
Implicit differentiation of multivariabled functions. This topic came up while I was tutoring a few times in college, and I found it tricky enough to warrant a small tutorial. Just a few quick examples and some key ideas to get through these types of problems


SLAM and Global Navigation on the iRobot Roomba using ROS

Last Updated 6/21/2011
This is a tutorial I wrote primarily for my adviser Matt Reynolds to explain a subset of my work from the summer to him.


Geometric Set Cover

Last Updated 5/2/2014
All of the students in my geometric algorithms class at Duke had to transcribe one of the lectures. My job was to summarize set cover, hitting set, and independent set in a geometric context. It turns out that we can exploit some results from epsilon nets in a geometric context to come up with better approximation algorithms for these NP-hard problems.

Recursion and Self-Similarity

Last Updated 8/20/2006
This is a tutorial I wrote on recursion back in high school for the Upper Dublin High School computer club (which I ran at the time). I talk about recursive functions, the Fibonacci sequence, the Towers of Hanoi, and fractals.