Как найти линию пересечения 2-х поверхностей
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как найти линию пересечения 2-х поверхностей

Как найти линию пересечения 2-х поверхностей

Ответ
Поиск в этой теме
Непрочитано 10.11.2010, 14:34 #1
Как найти линию пересечения 2-х поверхностей
slogos
 
Регистрация: 02.06.2009
Сообщений: 36

Вознамерился я на Lispe реализовать функцию, которая вычисляла бы координаты концов отрезка по которому пересекаются 2 плоскости.
Если плоскости в виде 3Dface, то эти точки можно получить как пересечение трех плоскостей чисто математически и это реализуемо. Попытался найти более простое решение. Превратил Fac-ы в поверхности и применил метод intersectWith и получил "ошибка Automation. Пока не реализовано". Эта подзадача нужна для вычисления в конечном итоге линии пересечения поверхностей, представленных в виде сети из 3DFace.
Буду рад любому совету.
Просмотров: 13762
 
Непрочитано 10.11.2010, 15:20
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от slogos Посмотреть сообщение
Если плоскости в виде 3Dface, то эти точки можно получить как пересечение трех плоскостей
Почему трёх?
Александр Ривилис вне форума  
 
Непрочитано 10.11.2010, 21:19
#3
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


математически:
точка пересечения 3х плоскостей - http://algolist.manual.ru/maths/geom...ct/3planes.php
прямая пересечения 2х плоскостей - направление прямой будет векторное произведение нормалей плоскостей, точку на прямой можно найти составив систему уравнениений из уравнений плоскостей
zamtmn вне форума  
 
Непрочитано 10.11.2010, 22:08
#4
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


3Dface - четырехточечник созданный из двух треугольников. Если смотреть на его точки, то первый треугольник 1-2-4, второй 2-3-4.
Пересечение двух плоскостей определенных по трем точкам решается путем разложения задачи на пересечение отрезками плоскости, определенной по точкам первого треугольника, а отрезки являются гранями второго треугольника. В результате получишь две точки.

http://forum.dwg.ru/showpost.php?p=487897&postcount=128
Supermax вне форума  
 
Автор темы   Непрочитано 11.11.2010, 06:23
#5
slogos


 
Регистрация: 02.06.2009
Сообщений: 36


Александру Ривилису. Получаю точку как пересечение трех плоскостей, составляю три уравнения плоскости - два это сами 3DFace и еще отвесная плоскость, проходящая через ребро грани. А как по другому?
И этот алгоритм реализован, есть прога проектирующая проектную нитку (полилинию) на поверхность - она работает именно так.
Но вопрос в другом. Действительно ли не реализована в ActiveX функция intersectWiht для поверхностей, или в каком то Cade (Vlispe) это все таки уже работает? Ведь поверхности в данном случае просты, т.е. плоскости. При тонировании четко обозначаются эти линии пересечения, значит информация об этом где то есть, почему же "не реализовано"? И второй вопрос - для каких 3Dпримивов это работает, во что можно превратить 3DFace?
slogos вне форума  
 
Непрочитано 11.11.2010, 09:07
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от slogos Посмотреть сообщение
Получаю точку как пересечение трех плоскостей, составляю три уравнения плоскости - два это сами 3DFace и еще отвесная плоскость, проходящая через ребро грани. А как по другому?
Пересечение прямой (ребро 3DFACE) с плоскостью (второй 3DFACE)
Цитата:
Сообщение от slogos Посмотреть сообщение
Действительно ли не реализована в ActiveX функция intersectWiht для поверхностей
Нет и очевидно, что никогда не будет. И причина лежит на поверхности: что возвращает intersectWith в тех случаях когда она работает? Точки. Что она должна вернуть при пересечении поверхностей? Линии.
Цитата:
Сообщение от slogos Посмотреть сообщение
во что можно превратить 3DFace?
Ни во что. Это простейший примитив, который ни на что не расчленяется.
Александр Ривилис вне форума  
 
Непрочитано 11.11.2010, 09:38
#7
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


но треугольную ячейку 3D-Face можно выдавить. Получится твёрдое тело. Только следует выбрать нужную сторону выдавливания...
Хмурый вне форума  
 
Автор темы   Непрочитано 11.11.2010, 10:40
#8
slogos


 
Регистрация: 02.06.2009
Сообщений: 36


выдавил относительно на небольшую величину, выполнил операцию пересечения этих тел, получил 3D тело которое действительно является персечением (некий параллелепипед). Попытался взять координаты его углов, но ничего не получается. Беру список через команду "List" в надежде увидеть список координат, а получаю координаты двух точек "верхней границы и нижней". (entget (car (entsel))) вообще дает dxf-список которого я никогда не видел. К сожалению я с 3Dтелами не работал и чего то не понимаю. Как же вытащить координаты "коробочки" которая получилась и приемлем ли такой путь? Что то он мне не нравится, может быть лучше решать вопрос надежными методами аналитической геометрии?
slogos вне форума  
 
Непрочитано 11.11.2010, 11:32
#9
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


slogos, из полученного тела пересечения можно извлечь рёбра _xedges.
Но лучше- аналитическая геометрия.
Хмурый вне форума  
 
Непрочитано 11.11.2010, 13:03
#10
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А если сделать так:
Есть два изломанных 3Dface. Пересекаются, не пересекаются - нам не известно. Создаем два набора линий, описывающих грани этих 3Dface. Далее, делаем IntersectWith одного 3Dface к группе линий (граней) другого. Из полученных результатов выбрасываем nil.
Затем делаем второму 3Dface то же самое, но по отношению к ребрам первого 3Dface и так же выбрасываем nil.
Затем объединяем оба результата в один список и выбрасываем повторяющиеся координаты точек. Что получится?
Получится группа точек принадлежащих линии пересечения.
Теперь надо определить последовательность их объединения в линию.
Supermax вне форума  
 
Автор темы   Непрочитано 11.11.2010, 13:33
#11
slogos


 
Регистрация: 02.06.2009
Сообщений: 36


Дело в том, что IntersectWith дает точки персечения только если скажем LIne пересекает (проходит через) ребро 3DFace. Если же линия пройдет просто через тело треугольника, то ничего не получим. А как раз и интересны те два случая, когда одна 3D грань персекает другую не касаясь ребрами. Или я чего то не поня в предлагаемом алгоритме?
slogos вне форума  
 
Непрочитано 11.11.2010, 14:20
#12
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я не про теугольники писал, а про конкретные примитивы 3Dface.
Если линия проходит через поверхность 3Dface, то мы получим точку на поверхности этого примитива. а линия эта - суть есть грань другого 3Dface. Вот так мы все точки и получим. Как их в линию соединить тоже есть мысли.
Supermax вне форума  
 
Автор темы   Непрочитано 11.11.2010, 14:39
#13
slogos


 
Регистрация: 02.06.2009
Сообщений: 36


В том то и дело, что не получим точку на поверхности 3Dface. Я сказал "треугольник" только потому, что так было удобнее. IntersectWith дает точки персечения для 3Dface только когда другой примитив пусть это будет LINE, касается ребра этой 3Dface.
slogos вне форума  
 
Непрочитано 11.11.2010, 15:03
#14
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Тогда надо попробовать объект solid. 3Dface можно перегнать в solid.
Еще можно перегнать 3Dface в mesh.
Я что-то засомневался в твоем утверждении.
Supermax вне форума  
 
Непрочитано 11.11.2010, 15:20
#15
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Как найти линию пересечения 2-х поверхностей
Тебе нужно найти линию пересечения двух плоскостей или кривую пересечения двух поверхностей?
Если с плоскостями, то дай формат их описания (три точки, точка и вектор, две линии итд) и формат линии пересечения.
Если вопрос в поверхностях, то необходимо более тщательно описать формат и правила по которым продолжаются поверхности дальше четырех точек в 3dface...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 11.11.2010, 15:45
#16
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Да, slogos прав. IntersectWith на пересечение плоскости и отрезка не работает нигде.
Значит будем лепить сами.

Надо найти функцию на принадлежность точки треугольнику и вс будет ОК.
Supermax вне форума  
 
Непрочитано 11.11.2010, 16:40
#17
Хмурый


 
Регистрация: 29.10.2004
СПб
Сообщений: 16,379


геометрический калькуллятор. функция ilp(p1,p2,p3,p4,p5)

Determines the intersection point between a line (p1,p2) and a plane passing through three points (p3,p4,p5).

P1 и P2- две вершины одной из пересекающихся граней, P3, P4 и P5 вершины второй грани. На выходе получаем координаты точки пересения.
Повторяем команду для следующей пары вершин первой грани.
Через полученные две точки проводим линию
PS только не пробовал, будет-ли ilp работать из-под ЛИСПа?
Хмурый вне форума  
 
Непрочитано 11.11.2010, 23:24
#18
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Есть одна аксиома:
Даны три точки треугольника a, b, c и точка x. Если сумма площадей треугольников x-a-b, x-b-c, x-a-c равны площади a-b-c, то точка x лежит внутри треугольника и на плоскости, описанной этим треугольником. Во всех остальных случаях - вне плоскости или вне треугольника.

Можно функцию написать, определяющую принадлежность точки треугольнику.
Supermax вне форума  
 
Автор темы   Непрочитано 12.11.2010, 06:35
#19
slogos


 
Регистрация: 02.06.2009
Сообщений: 36


Если не искать легких путей, т.е. решать "на низком уровне", то вопрос на половину решен. Составляются шесть систем урвнений плоскости (по 3 в каждой системе). Их решение дает шесть точек, из которых нужно выбрать 2. Здесь и используется функция попадания точки внутрь треугольника и именно путем вычисления площадей по формуле Герона (кажется). Евгений, в конечном итоге нужно найти 3Dполилинию, являющуюся линией пересечения двух поверхностей (не сглаженных) представленных сетью треугольников в виде 3Dface. Иначе говоря две TIN-модели рельефа, например карьера снятого геодезистами в разное время. Необходимо сделать т.н. врезку рельефа. Так вот построить 3Dполилинию пересечения одна из подзадач. Коллеги, спасибо за участие, я уже много почерпнул, например, не знал про _.xedge, жду советов еще.
Как получить отдельные отрезки пересечений мне понятно, а вот как соеденить их в полилинию, пока не знаю, нужно ли их соединять тоже не уверен. Нужно ведь перестроить те треугольники (3Dface), через которые проходит секущая, а сама секущая не нужна. Жду советов.
-----------------------------------------------------
[FONT=Times New Roman][size=3]Вот конкретная задача.[/size][/FONT]
[FONT=Times New Roman][size=3]Будет три случая расположения этих 6 точек. В каждом из них 2 точки будут за пределами граней и они нас не интересуют.[/size][/FONT]
[FONT=Times New Roman][size=3]1)Одно ребро является общим для граней – тогда все шесть точек попарно будут располагаться на концах этого ребра[/size][/FONT]
[FONT=Times New Roman][size=3]2)Плоскость одной грани пересекает оба ребра второй (поглощение) – тогда: 2 точки будут внутри большей грани , 2 – на ребрах этой же грани, 2 – вне граней.[/size][/FONT]
[FONT=Times New Roman][size=3]3)Плоскость одной грани пересекает лишь одно ребро второй – тогда одна точка расположена внутри одной грани, 2 – на ребрах этой же грани и одна на ребре второй грани.[/size][/FONT]
[FONT=Times New Roman][size=3]Необходимо выбрать две точки – концы отрезка пересечения.[/size][/FONT]
[FONT=Times New Roman][size=3]Автору лучшего алгоритма будет объявлена публичная благодарность.[/size][/FONT]

Последний раз редактировалось Кулик Алексей aka kpblc, 12.11.2010 в 08:49.
slogos вне форума  
 
Автор темы   Непрочитано 22.11.2010, 12:23
#20
slogos


 
Регистрация: 02.06.2009
Сообщений: 36


Завершил функцию построения отрезков (в сыром виде, конечно), являющихся линиями пересечения 3DFac_ов, точнее поверхностей ими представленных. Предлагаю потестировать (кому интересно, конечно). Желательно на различных данных (поверхностях). Для начала один вариань приложил.
Команда для выполнения - "3DFACE_INT". Буду рад сообщениям. С уважением, slogos.
Вложения
Тип файла: rar slogos.rar (37.9 Кб, 128 просмотров)

Последний раз редактировалось slogos, 22.11.2010 в 12:31. Причина: Забыл вложение
slogos вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как найти линию пересечения 2-х поверхностей



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как найти линию пересечения двух плоскостей в AutoCad. Atlant AutoCAD 1 11.09.2009 12:46
Как найти линию пересечения двух плоскостей в VBA? молод и перспективен Программирование 7 10.07.2009 15:36
Развертка линии пересечения 3D объектов alextv Программирование 3 14.06.2009 19:30
Как в акаде построить линию пересечения 2-х плоскостей. Witalij AutoCAD 2 29.04.2009 16:40
Создание линии пересечения поверхностей в Civil 3D 2007 miner Вертикальные решения на базе AutoCAD 12 26.03.2009 14:02