# Detect rigid body motions in a cloud of points

This question popped up today in our group meeting. Suppose you are given a cloud of N points in 2D and each is associated with a velocity vector. These points are associated with particles on a 2D interface and velocities are obtained via simple particle tracking.

The interface we are studying is not "clean" in the sense that there are solid "island" spread over the liquid interface. As a results, some of the particles actually sit on the said islands while remaining ones are spread on the liquid interface.

Here's the question: Given the velocity information can you determine and isolate the particles on the solid islands? I did a quick search but could not find anything useful but came up with a simple algorithm based on computing relative angular velocities between all particle pairs. If particle $\mathbf{p}_i$ and $\mathbf{p}_j$ belong to the same rigid body, then one can write: $$\mathbf{v}_j = \mathbf{v}_i + \Omega_{ij} \:\hat{\mathbf{k}} \times \mathbf{r}_{ji},$$ where $\mathbf{r}_{ji} = \mathbf{r}_j - \mathbf{r}_i$ is the relative position. For any particle $\mathbf{p}_k$ that belongs to the same rigid body, one requires that $\Omega_{ik} = \Omega_{jk} = \Omega_{ij}$. Finally I detect the islands by generating a histogram of the matrix entries and looking of the peaks.

Here is a sample made-up examples, were a bunch of random points are considered. Red and blue particles belong to two different rigid bodies with $\Omega_{red} = 5$ and $\Omega_{blue} = 10$. Black particles are assumed to be Brownian and have random velocities. As you can see the histogram detects two peaks at 5 and 10 but also fictitious peaks around 0.  Can you think of a better algorithm or point me to some references?