Как узнать, находится ли набор point3D в одной плоскости?

У меня есть набор point3D (X, Y, Z). Мне нужно проверить, копланарны ли они с какими-то допусками. Мой способ сделать это так: я конвертирую все точки из глобальной системы координат в локальную, где локальные x, y находятся в одной плоскости с плоскостью, определяемой тремя точками в наборе, а z перпендикулярно этой плоскости. И затем все, что мне нужно сделать, это проверить, все ли точки в наборе имеют примерно одинаковые локальные значения z.

Однако сложность состоит в том, как выбрать 3 точки для определения базовой плоскости. При случайном выборе это может привести к тому, что иногда набор точек компланарен, а иногда - нет. У вас есть какие-либо предложения?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
173
2

Ответы 2

Вероятно, наиболее распространенный способ сделать это - с помощью анализа главных компонентов: https://en.wikipedia.org/wiki/Principal_component_analysis

Краткое описание:

  1. Вычислить ковариационную матрицу 3x3 входных точек
  2. Извлеките наименьший собственный вектор. Это нормальный вектор для плоскости, которая соответствует наименьшей квадрату ошибки для всех ваших точек.
  1. нормальный n

    выберите любые 3 точки из вашего набора данных, которые не находятся в одной строке, позвольте называть их p0,p1,p2. Для повышения точности они должны быть удалены друг от друга. Теперь, чтобы построить нормальный вектор, сделайте следующее:

    n = cross( p1-p0 , p2-p0 ); // perpendicular vector to both operands of cross
    n /= |n|;                   // unit vector
    
  2. проверить все точки

    для любой точки на плоскости, образованной p0,p1,p2, компонент altitude (в нормальном направлении) должен быть равен нулю, поэтому для любой точки p:

    |dot( p-p0 , n )|<=1e-10
    

    1e-10 - это просто какой-то нулевой порог из-за потери точности на FPU ... Любая точка, не удовлетворяющая условию, не принадлежит плоскости ...

Итак, как выбрать 3 точки, образующие треугольник?

  1. выбрать p0,p1

    выберите p0 как точку с минимальными координатами x,y,z и p1 с максимальными координатами x,y,z. Это гарантирует, что они достаточно далеко.

  2. выбрать p2

    теперь ищите точки и найдите такое, что |dot( p1-p0, pi-p0 )| минимален. При этом |pi-p0| не нулевой и достаточно большой (например 0.1*|p1-p0| хотя бы). Это гарантирует, что точки образуют треугольник и не находятся слишком близко друг к другу.

Все это можно сделать в O(n), так что все еще быстро ...

Разве это не то же самое, что я описал в своем вопросе? Проблема здесь в том, какой критерий использовать для выбора p1, p2 и p3. Это довольно сложно, поскольку, например, если все точки копланарны, кроме точки p3, то выбор может привести к неверным результатам.

N.T.C 03.01.2019 09:53

@ N.T.C Да, ты прав, извини, я забыл отправить вторую часть ответа ... глупый я :)

Spektre 03.01.2019 09:59

Другие вопросы по теме