Geometry Processing, Spring 2026

Michael Kazhdan


Assignment 2: Combinatorial Smoothing

Due on February 21 (Saturday) at 11:59 PM


Overview

In this assignment you will impliment combinatorial smoothing, comparing the performance of explicit and implicit time-stepping.

Getting Started

You should use the code (GeometryProcessing.zip) as a starting point for your assignment. We provide you with numerous files, but you should only have to change CombinatorialSmoothing/CombinatorialSmoothing.cpp.

After you download the files, the first thing to do is compile the CombinatorialSmoothing executable.


How to Invoke the Executable

The executable runs on the command line. It takes a geometry file as input, either in ply or in obj file format (determined by the file extension) and opens up an OpenGL-based viewer visualizing progressive smoothing the vertex positions.
To see the supported command line arguments, run the executable without an argyments:
% CombinatorialSmoothing
To smooth the geometry, invoke the executable as:
% CombinatorialSmoothing --in <input geometry> --stepSize <gradient-descent step-size>
With: The executable also supports an optional --implicit flag. If specified, the smoothing should be performed using implicit time-stepping.

How to Interact with the Executable

Upon invocation, the executable will open an OpenGL window where the smoothing will be animated.
The basic supported interfaces are:

What You Have to Do

You will need to mofiy the CombinatorialSmoothing/CombinatorialSmoothing.cpp file to support explicit and implicit time-stepping of the gradient-descent PDE.
To achieve this, you will have to make changes in two places:
  1. In the CombinatorialSmoothingViewer::CombinatorialSmoothingViewer constructor you will need to set the combinatorial Laplacian, CombinatorialSmoothingViewer::_L, and initialize the sparse Cholesky solver, CombinatorialSmoothingViewer::_solver. (Note that the identity matrix, CombinatorialSmoothingViewer::_Id, is already set for you.)
  2. In the CombinatorialSmoothingViewer::animate member function you will need to update the the vertex positions, Mesh::vertices, to represent the values at the next time-step. The size of the time-step is stored in the CombinatorialSmoothingViewer::_stepSize member data.
Please see the assignment description for additional details.

Questions


What to Submit

Please submit your implementation on canvas.
For this assignment, you should submit: