Maybe you are right, but I'm not currently aware if C2 does this optimization of not checking already checked pairs in reverse order.
I used to believe it just did two nested loops checking every instance from Family1 Vs every instance of Family2, since the most usual cases of use doesn't involve checking the same instances.
In this case 'Family On Collision with Family' would check X-X, X-Y, X-Z, Y-X, Y-Y, Y-Z, Z-X, Z-Y, Z-Z.
I'm in doubt now about what really happens under the hood.