The reading will expose you to some of the key issues to think about when designing a discrete Laplacian. For this reading, you can choose either of the following two papers:

- Wardetzky, Mathur, Kälberer, Grinspun,
*“Discrete Laplace Operators: No Free Lunch”*(2007) - Bobenko & Springborn,
*“A Discrete Laplace-Beltrami Operator for Simplicial Surfaces”*(2007)

You should not worry about deeply understanding all of the mathematical details in these papers; the point is just to get a sense of the issues at stake, and how these considerations translate into practical definitions of discrete Laplace matrices. The first paper, by Wardetzky et al, considers a “No Free Lunch” theorem for discrete Laplacians that continues our story of “The Game” played in discrete differential geometry. The second paper, by Bobenko & Springborn considers the important perspective of *intrinsic triangulations* of polyhedral surfaces, and uses this perspective to develop a Laplace operator that is well-behaved even for very poor quality triangulations. You should simply summarize the high-level ideas in these papers, and any questions you might have.

The reading is due on **Thursday, March 28 at 10am Eastern time**. Hand-in instructions are as usual described on the assignments page.

For the coding portion of this assignment, you will build the so-called *“cotan-Laplace”* matrix and start to see how it can be used for a broad range of surface processing tasks, including the *Poisson equation* and two kinds of *curvature flow*.

Getting Started

Please implement the following routines in

`core/geometry.js`:`laplaceMatrix``massMatrix`

`projects/poisson-problem/scalar-poisson-problem.js`:- constructor
- solve

`projects/geometric-flow/mean-curvature-flow.js`:- buildFlowOperator
`integrate`

`projects/geometric-flow/modified-mean-curvature-flow.js`:`constructor``buildFlowOperator`

Notes

- Sections 6.4-6 of the course notes describe how to build the cotan-Laplace matrix and mass matrices, and outline how they can be used to solve equations on a mesh. In these applications you will be required to setup and solve a linear system of equations $Ax=b$ where $A$ is the Laplace matrix, or some slight modification thereof. Highly efficient numerical methods such as Cholesky Factorization can be used to solve such systems, but require A to be symmetric positive definite. Notice that the cotan-Laplace matrix described in the notes is
**negative semi-definite**. To make it compatible for use with numerical methods like the Cholesky Factorization, your implementation of`laplaceMatrix`should instead produce a**positive definite matrix**,*i.e.*, it should represent the expression

$$(\Delta u)_i=\frac12 \sum_{ij}(\cot \alpha_{ij}+\cot \beta_{ij})(u_i–u_j).$$(Note that $u_i−u_j$ is reversed relative to the course notes.) To make this matrix strictly positive definite (rather than semidefinite), you should also add a small offset such as $10^{-8}$ to the diagonal of the matrix (which can be expressed in code as a floating point value`1e-8`). This technique is known as Tikhonov regularization. - The mass matrix is a diagonal matrix containing the barycentric dual area of each vertex.
- In the scalar Poisson problem, your goal is to discretize and solve the equation $\Delta \phi = \rho$ where $rho$ is a scalar density on vertices and $\Delta$ is the Laplace operator. Be careful about appropriately incorporating dual areas into the discretization of this equation (i.e., think about where and how the mass matrix should appear); also remember that the right-hand side cannot have a constant component (since then there is no solution).
- In your implementation of the implicit mean curvature flow algorithm, you can encode the surface $f:M \to \mathbb R^3$ as a single DenseMatrix of size $|V| \times 3$, and solve with the same (scalar) cotan-Laplace matrix used for the previous part. When constructing the flow operator, you should follow section 6.6 of the notes. But be careful – when we discretize equations of the form $\Delta f = \rho$, we create systems of the form $A f = M \rho$. So you’ll need to add in the mass matrix somewhere. Also, recall that our discrete Laplace matrix is the negative of the actual Laplacian.
- The modified mean curvature flow is nearly identical to standard mean curvature flow. The one and only difference is that you should
**not**update the cotan-Laplace matrix each time step, i.e., you should always be using the cotans from the original input mesh. The mass matrix, however, must change on each iteration.

Submission Instructions

Please rename your `geometry.js, scalar-poisson-problem.js, mean-curvature-flow.js `and

In the slides we derived a Steiner formula for polyhedral surfaces in \(\mathbb{R}^3\), by considering the Minkowski sum with a ball and working out expressions for the areas and curvatures associated with vertices, edges, and faces. But we can also get a Steiner formula for smooth surfaces, using the expressions already derived in class. In particular, recall that for a closed surface \(f: M \to \mathbb{R}^3\) with Gauss map \(N\), we can obtain the basic curvatures by just wedging together \(df\) and \(dN\) in all possible ways:

\[\begin{array}{rcl}

df \wedge df &=& 2NdA \\

df \wedge dN &=& 2HNdA \\

dN \wedge dN &=& 2KNdA \\

\end{array}

\]

Here \(H\) and \(K\) denote the mean and Gauss curvature (resp.), and dA is the area form induced by \(f\). For sufficiently small \(t\), taking a Minkowski sum with a ball is the same as pushing the surface in the normal direction a distance \(t\). In other words, the surface

\[

f_t := f + tN

\]

will describe the “outer” boundary of the Minkowski sum; this surface has the same Gauss map \(N\) as the original one. To get its area element, we can take the wedge product

\[

\begin{array}{rcl}

df_t \wedge df_t

&=& (df + t dN) \wedge (df + t dN) \\

&=& df \wedge df + 2t df \wedge dN + t^2 dN \wedge dN,

\end{array}

\]

where we have used the fact that \(\alpha \wedge \beta = \beta \wedge \alpha\) when \(\alpha,\beta\) are both \(\mathbb{R}^3\)-valued 1-forms. The list of identities above then yields

\[

df_t \wedge df_t = (2 + 4tH + 2t^2 K)NdA,

\]

or equivalently,

\[

\fbox{\(dA_t = (1+2tH+t^2K)dA.\)}

\]

In other words, just as in the polyhedral case, the rate at which the area is growing is a polynomial in the ball radius \(t\); the coefficients of this polynomial are given by the basic curvatures of the surface (also known as *quermassintegrals!*).

Warning: We renumbered the Exercises in the course notes to make more sense, so you make sure you refer to the updated notes when doing these exercises.