Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Триангуляция срезов замкнутой поверхности 
V
    Опции темы
gendalf7771
Дата 22.4.2014, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 19.7.2012
Где: Архангельск

Репутация: нет
Всего: нет



Доброго времени суток!

Есть набор сечений вдоль одной оси. На каждом сечении имеется последовательность точек, описывающая замкнутый контур.
user posted image
Необходимо триангулировать поверхность, построенную на точках двух соседних срезов.

Мой черновой вариант — взять точку на первом срезе, взять ближайшую к ней точку на втором срезе, и в одном направлении (например, по часовой стрелке) из двух следующих точек на каждом контуре выбирать одну, которая будет использоваться для построения треугольника. Таким образом, для каждого нового треугольника потребуется всего лишь выбрать одну точку из двух. Критерий выбора у меня такой: из двух точек выбирается та, расстояние от которой до точки другого среза меньшее. Т.е. для случая
user posted image,
где А1 и А2 — начальные точки, происходит выбор между В1 и В2. Если расстояние А1В2 меньше расстояния А2В1, то выбирается точка В2, и строится треугольник А1А2В2. Далее начальными становятся А1 и В2, и процесс повторяется, пока не будет повторно задействована в построении треугольника точка А1 или А2.

Проблема в том, что этот алгоритм я набросал на скорую руку, его математическую обоснованность проверить не получается, а значит, использовать тоже. Поэтому прошу помочь либо с обоснованностью (может кому-то это покажется очевидным), либо с поиском другого алгоритма триангуляции. Не использую алгоритм Делоне, т.к. слишком много вычислений для такой простой задачи.

Заранее спасибо.
PM MAIL   Вверх
Mirkes
Дата 23.4.2014, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Есть один существенный вопрос: число точек в каждом сечении одинаково?
Если одинаково, то Ваш алгоритм видимо наилучший. 
Впрочем он будет работать и в том случае если число точек различно.
Возможно в качестве стартовой пары точек стоит выбрать пару с наименьшим расстоянием. Если точки упорядочены вдоль контура то нахождение ближайших точек не потребует слишком большого числа вычислений. Кроме того, если запоминать вычисленные расстояния, то после вычисления 2-3N расстояний уже ничего считать не придется.

Насчет математической обоснованности. Что именно следует обосновать? То, что это триангуляция? Довольно очевидно. То, что это наилучшая триангуляция? Тогда укажите критерий качества триангуляции. Например, триангуляция Делоне это триангуляция без тупоугольных треугольников.


--------------------
Mirkes
PM MAIL   Вверх
gendalf7771
Дата 23.4.2014, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 19.7.2012
Где: Архангельск

Репутация: нет
Всего: нет



Число точек в разных сечениях разное.

Обосновать необходимо работоспособность алгоритма. Да, он триангулирует, но вдруг он когда-нибудь пропустит одну или несколько точек? Кроме этой проблемы препод прикопался к критерию выбора следующей точки, мол, не самый очевидный способ, и надо пояснить, почему расстояние точек с противоположных срезов является показателем. smile 
PM MAIL   Вверх
Mirkes
Дата 23.4.2014, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Забавно. Предлагаю описание алгоритма (Вашего!). Пока пропускаю всяческие вопросы об оптимизации.
Обозначим все точки первого контура через А(к) k=1,n, а второго через В(к) k=1,m
1. Находим А® и B(q) такие, что расстояние между этими точками минимальное из всех расстояний между точками А(к) и В(с).
2. Для простоты перенумеруем точки множеств А и В так, что бы 
   2.1. r=q=0 (найденная пара точек станет нулевыми)
   2.2. остальные точки следовали по часовой стрелке (не нравится по часовой, сделайте против, только в одном направлении:))
   2.3. продублируем первые точки в конец, чтобы не думать о разрыве smile
3. Номер текущей точки в множестве А обозначим а, исходно положим а=0
4. Номер текущей точки множества В обозначим через b, исходно b=0
5. Основной цикл. Определяем кандидата на включение в треугольник среди точек A(a+1) и B(b+1)
   5.1. Если a<=n, b<=m
      5.1.1. Если |A(a+1)-B(b)|<|A(a)-B(b+1)| тогда С=A(a+1), треугольник A(a),B(b),C, a=a+1
      5.1.2. Иначе С=B(b+1), треугольник A(a),B(b),C, b=b+1
   5.2. Если a=n тогда С=B(b+1), треугольник A(a),B(b),C, b=b+1
   5.3. Если b=m тогда С=A(a+1), треугольник A(a),B(b),C, a=a+1
   5.4. Если a=n и b=m тогда все!


В этом алгоритме у Вас нет шансов пропустить точку!


--------------------
Mirkes
PM MAIL   Вверх
gendalf7771
Дата 24.4.2014, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 19.7.2012
Где: Архангельск

Репутация: нет
Всего: нет



В таком описании очевидным стало гораздо больше, спасибо! Даже лучше стало, ибо изначально я планировал считать расстояния по user posted image, а про проекции и забыл.

А тут разве можно что-то оптимизировать? smile

Остаётся самый противный вопрос:
Цитата(gendalf7771 @  23.4.2014,  14:26 Найти цитируемый пост)
почему расстояние точек с противоположных срезов является показателем?

Я не понимаю его.
PM MAIL   Вверх
Mirkes
Дата 24.4.2014, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Цитата(gendalf7771 @  24.4.2014,  11:40 Найти цитируемый пост)
Остаётся самый противный вопрос:
Цитата(gendalf7771 @  23.4.2014,  14:26 )
почему расстояние точек с противоположных срезов является показателем?

Я не понимаю его. 

А я не понимаю Вас smile. Вы строите триангуляцию поверхности, которая ЗАДАНА точками на сечениях. Насколько я понимаю, точки - это все, что у Вас есть. Больше ничего нет! Если я правильно понимаю, то точки заданы в трехмерном пространстве. Так что считаем обычное евклидово расстояние. Я подразумевал именно его, так что ваша формула верна, никаких проекций! Выигрыш в том, что расстояния считаются не между всеми точками smile Единственное, что я бы предложил - корни не извлекать, поскольку вы сравниваете на больше - меньше, то извлекли вы корень или нет не важно.

Описанный в предыдущем посте алгоритм дает одну сторону треугольника на одном из сечений и две стороны между сечениями. 
Тупо не понимаю, что имеется в виду под "показателем"? smile 

Кажется дошло  smile Если мы рассмотрим два сечения в ортогональных плоскостях, причем сечение А будет иметь маленький размер, а сечение В - большой, то далекие точки сечения В будут задействованы только тогда, когда кончатся точки в сечении А. Это действительно может быть проблемой, но нужно сесть и спокойно посмотреть. Посмотрел первый топик и понял что все плоскости сечений параллельны.

Теперь дошло. Возьмите картинку из первого поста и сдвиньте одно из сечений в любую сторону на 3-4 диаметра. Из Вашего алгоритма получится паршивая штука  smile 
Однако Это только упрощает задачу. Если мы имеем выпуклые контуры то все совсем просто.  Упорядочиваем точки по углу с какой-либо осью (все равно какой, например осью х, которая смотрит направо). Важно, что бы с одной и той же осью в обоих срезах. Далее используем тот же алгоритм, НО РАССТОЯНИЕ ОПРЕДЕЛЯЕТСЯ ТОЛЬКО УГЛОМ!
Кстати для не параллельных срезов этот алгоритм будет так же прекрасно работать.
Могут возникнуть сложности с не выпуклыми срезами, но порядок то, у Вас изначально задан, перебираем точки и сравниваем углы. Иногда возможны откаты по углу в связи с отсутствием выпуклости, но все равно поверхность должна получаться достаточно приличной.

Успехов!


--------------------
Mirkes
PM MAIL   Вверх
gendalf7771
  Дата 25.4.2014, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 19.7.2012
Где: Архангельск

Репутация: нет
Всего: нет



Премного благодарю, Вы мне здоровски помогли! smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.