Я программирую на C ++ с помощью PCL, облака точек, библиотеки.
Моя проблема: вычисление дисперсии некоторых точек, но только относительно перпендикулярной оси относительно плоскости. Я объясню себе:
Поэтому я делю облако точек на сегменты по гладкости поверхности (с сегментация растущего региона). Для каждого сегмента я хотел бы измерить, насколько точна поверхность, и я подумал, что лучшим способом было бы вычислить плоскость, которая наилучшим образом соответствует точкам на поверхности, а затем в основном вычислить дисперсию точек относительно плоскости. (расстояние от точки до плоскости и т. д.).
Так что я знаю, что в 3D существует квадратичная или сплайн-интерполяция, но я не очень хорош в этом, и я думаю, что должна быть библиотека, которая уже выполняет это. Однако большинство из тех, что я нашел, не вычисляют / не возвращают уравнение плоскости, поэтому я не совсем уверен, как это сделать.
Любая помощь приветствуется, ура.
вам нужны базисные векторы для этого … так что давайте N
будь твоим самолетом нормальным. Для интерполяции вашей плоскости вам нужно 2 базисных вектора U,V
внутри вашего самолета и одна начальная точка P0
принадлежность к этой плоскости …
Предположим, мы знаем N,P0
Итак U,V
можно вычислить, используя перекрестное произведение:
// U is any vector non parallel to N
U = (1.0,0.0,0.0)
if (|dot(U,N)|>0.75) U = (0.0,1.0,0.0)
// make U,V perpendicular to N and each other
V = cross(N,U)
U = cross(V,N)
// normalize U,V,N
U = U/|U|
V = V/|V|
N = N/|N|
Теперь любую точку на плоскости можно интерполировать следующим образом:
P(u,v) = P0 + u*U + v*V
куда u,v
ваши скалярные параметры интерполяции, которые также равны перпендикулярному расстоянию P(u,v)
в U
а также V
направления от P0
,
Чтобы оценить расстояние вашей точки от плоскости (высоты), вы можете просто сделать это
alt = dot(N,P(u,v)-P0)
так что квадратики не нужны … Точно так же, если вам нужно u,v
в какой-то момент P
вы можете сделать это:
u = dot(U,P-P0)
v = dot(V,P-P0)
Других решений пока нет …