I don’t know how re-usable this approach would be, but it might be a starting point for you in thinking about how to approach this particular puzzle.

We start with a grid that we’ve deformed with a magnet. We’ll need null SOPs that point to both of these:

Next you’ll convert both of these to CHOPs (I think the math here will be faster to perform in CHOPs than in Python):

.

To figure out who has changed we need to think of that coordinate as a single value - we can use the length of a vector as a comparison here. We can use a math CHOP to compute the length of each input CHOP, then subtract the two lengths from one another. If the value of the length of the vector is equal between points we’d end up with a result of 0, anything else is a point that’s changed:

We’ll rename this channel to “keep”, and merge it in with the CHOP data form our magnet SOP:

To find out how much a point has changed, we can do something similar - this time we’ll take both SOP to CHOPs, and subtract them from one another, then derive the length of the result. We can then rename this to "dispForce’ and merge it with our SOP to CHOP data:

Next we’ll use a delete CHOP to remove any samples that are greater than 0 (we need to make sure we’re looking at the “keep” channel:

Next we can covert back to SOPs - we can use the dispForce channel we created and assign it to the point weight attribute of the converted points. A convert SOP will convert this into just points rather than a connected set of points. A SOP to DAT let’s us confirm that we’ve correctly assigned a value to our point weight attribute:

That doesn’t get you a mesh, but it does get you all the changed points and a sense of how much they’ve changed. Building a mesh will be a little tricky - it’d be easy to end up with an odd number of points. How you map these back into polygons would take a little extra work. Hopefully this will get you started though:

base_changed_points.tox (1.5 KB)