испытание / группировка по самолетам в одной нормальной группе
Идея состоит в том, чтобы выбрать 3 точки из плоскости вычислений группы и проверить, какие точки группы принадлежат ей. Если счет слишком низкий, вы выбрали неверные точки (не принадлежащие к одной плоскости) и вам нужно выбрать разные. Также, если выбранные точки находятся слишком близко к каждой или на одной линии, вы не можете получить правильную плоскость от нее.
Математическая функция для плоскости:
x*nx + y*ny + z*nz + d = 0
, где (nx,ny,nz)
- нормали к группе (единичный вектор), а (x,y,z)
- ваша точечная позиция. Таким образом, вы просто вычисляете d
из известной точки (одна из выбранных (x0,y0,z0)
) ...
d = -x0*nx -y0*ny -z0*nz
, а затем просто проверьте, какие точки удовлетворяют этому условию:
threshod=1e-20; // just accuracy margin
fabs(x*nx + y*ny + z*nz + d) <= threshod
теперь удаляйте совпадающие точки из группы (перемещайте их в найденный объект плоскости) и снова применяйте эту пулю к оставшимся точкам, пока их количество не станет низким или не будет найдена действительная плоскость ...
затем проверить другую группу, пока не останется ни одной группы ...