|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Как найти линию пересечения 2-х поверхностей
Регистрация: 02.06.2009
Сообщений: 36
|
||
Просмотров: 13762
|
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
математически:
точка пересечения 3х плоскостей - http://algolist.manual.ru/maths/geom...ct/3planes.php прямая пересечения 2х плоскостей - направление прямой будет векторное произведение нормалей плоскостей, точку на прямой можно найти составив систему уравнениений из уравнений плоскостей |
|||
![]() |
|
||||
3Dface - четырехточечник созданный из двух треугольников. Если смотреть на его точки, то первый треугольник 1-2-4, второй 2-3-4.
Пересечение двух плоскостей определенных по трем точкам решается путем разложения задачи на пересечение отрезками плоскости, определенной по точкам первого треугольника, а отрезки являются гранями второго треугольника. В результате получишь две точки. http://forum.dwg.ru/showpost.php?p=487897&postcount=128 |
||||
![]() |
|
||||
Регистрация: 02.06.2009
Сообщений: 36
|
Александру Ривилису. Получаю точку как пересечение трех плоскостей, составляю три уравнения плоскости - два это сами 3DFace и еще отвесная плоскость, проходящая через ребро грани. А как по другому?
И этот алгоритм реализован, есть прога проектирующая проектную нитку (полилинию) на поверхность - она работает именно так. Но вопрос в другом. Действительно ли не реализована в ActiveX функция intersectWiht для поверхностей, или в каком то Cade (Vlispe) это все таки уже работает? Ведь поверхности в данном случае просты, т.е. плоскости. При тонировании четко обозначаются эти линии пересечения, значит информация об этом где то есть, почему же "не реализовано"? И второй вопрос - для каких 3Dпримивов это работает, во что можно превратить 3DFace? |
|||
![]() |
|
||||
Цитата:
Цитата:
Ни во что. Это простейший примитив, который ни на что не расчленяется. |
||||
![]() |
|
||||
Регистрация: 02.06.2009
Сообщений: 36
|
выдавил относительно на небольшую величину, выполнил операцию пересечения этих тел, получил 3D тело которое действительно является персечением (некий параллелепипед). Попытался взять координаты его углов, но ничего не получается. Беру список через команду "List" в надежде увидеть список координат, а получаю координаты двух точек "верхней границы и нижней". (entget (car (entsel))) вообще дает dxf-список которого я никогда не видел. К сожалению я с 3Dтелами не работал и чего то не понимаю. Как же вытащить координаты "коробочки" которая получилась и приемлем ли такой путь? Что то он мне не нравится, может быть лучше решать вопрос надежными методами аналитической геометрии?
|
|||
![]() |
|
||||
А если сделать так:
Есть два изломанных 3Dface. Пересекаются, не пересекаются - нам не известно. Создаем два набора линий, описывающих грани этих 3Dface. Далее, делаем IntersectWith одного 3Dface к группе линий (граней) другого. Из полученных результатов выбрасываем nil. Затем делаем второму 3Dface то же самое, но по отношению к ребрам первого 3Dface и так же выбрасываем nil. Затем объединяем оба результата в один список и выбрасываем повторяющиеся координаты точек. Что получится? Получится группа точек принадлежащих линии пересечения. Теперь надо определить последовательность их объединения в линию. |
||||
![]() |
|
||||
Регистрация: 02.06.2009
Сообщений: 36
|
Дело в том, что IntersectWith дает точки персечения только если скажем LIne пересекает (проходит через) ребро 3DFace. Если же линия пройдет просто через тело треугольника, то ничего не получим. А как раз и интересны те два случая, когда одна 3D грань персекает другую не касаясь ребрами. Или я чего то не поня в предлагаемом алгоритме?
|
|||
![]() |
|
||||
Я не про теугольники писал, а про конкретные примитивы 3Dface.
Если линия проходит через поверхность 3Dface, то мы получим точку на поверхности этого примитива. а линия эта - суть есть грань другого 3Dface. Вот так мы все точки и получим. Как их в линию соединить тоже есть мысли. |
||||
![]() |
|
||||
Регистрация: 02.06.2009
Сообщений: 36
|
В том то и дело, что не получим точку на поверхности 3Dface. Я сказал "треугольник" только потому, что так было удобнее. IntersectWith дает точки персечения для 3Dface только когда другой примитив пусть это будет LINE, касается ребра этой 3Dface.
|
|||
![]() |
|
||||
Цитата:
Если с плоскостями, то дай формат их описания (три точки, точка и вектор, две линии итд) и формат линии пересечения. Если вопрос в поверхностях, то необходимо более тщательно описать формат и правила по которым продолжаются поверхности дальше четырех точек в 3dface...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Регистрация: 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 работать из-под ЛИСПа? |
|||
![]() |
|
||||
Есть одна аксиома:
Даны три точки треугольника a, b, c и точка x. Если сумма площадей треугольников x-a-b, x-b-c, x-a-c равны площади a-b-c, то точка x лежит внутри треугольника и на плоскости, описанной этим треугольником. Во всех остальных случаях - вне плоскости или вне треугольника. Можно функцию написать, определяющую принадлежность точки треугольнику. |
||||
![]() |
|
||||
Регистрация: 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. |
|||
![]() |
|
||||
Регистрация: 02.06.2009
Сообщений: 36
|
Завершил функцию построения отрезков (в сыром виде, конечно), являющихся линиями пересечения 3DFac_ов, точнее поверхностей ими представленных. Предлагаю потестировать (кому интересно, конечно). Желательно на различных данных (поверхностях). Для начала один вариань приложил.
Команда для выполнения - "3DFACE_INT". Буду рад сообщениям. С уважением, slogos. Последний раз редактировалось slogos, 22.11.2010 в 12:31. Причина: Забыл вложение |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как найти линию пересечения двух плоскостей в 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 |