|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Вычисление площади 3Dface, Mesh и PolygonMesh
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 8876
|
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Если захочешь второе, вот тебе 3 готовые ф-ции подсчета площади треугольника
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Почему именно 2 и 4, а не 1 и 3? Это как на него смотреть. И соответственно разбить 3DFACE можно на два плоских треугольника по-разному, и площади (в общем случае) тоже будут разные.
|
||||
![]() |
|
||||
Не, не, не! Именно 2 и 4. Почему? - А фиг его знает!
Берем 3Dface, изгибаем и включаем раскраску. Крутим и видим грань на 2-ой и 4-ой точках. Я ставлю 4 точки в разных z-ах и по ним строю 3Dface, и он, зараза, сам разворачивается и 2 и 4 точки образуют острую грань. И получается, что разбить 3Dface можно только на два определенных треугольника. Последний раз редактировалось Supermax, 30.10.2010 в 22:30. |
||||
![]() |
|
||||
|
||||
![]() |
|
||||
Александр Ривилис, смех смехом, но мне вот тоже стало интересно, и я строил по четырём точкам в разной последовательности 3DГРАНи, и всегда излом проходил через 2 и 4 вершины.
__________________
Почему все вдруг становятся умными, когда уже не надо? |
||||
![]() |
|
||||
В общем случае, я рекомендовал бы другой подход - находим среднюю точку, между вершинами поверхности и делим поверхность на треугольники изходя из пар соседних вершин и средней точки (возможна ситуация, когда пара точек совпадают). Потом вычисляем суммарную площадь треугольников - точность будет несколько выше, но не очень...
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Не согласен.
Есть 4 точки и они определены как 3Dface. Это конечный продукт. Он распадается только на два треугольника. Точнее треугольники конечный продукт, а 3Dface перед ним. НО! Конвертация 3Dface в Mesh производится приблизительно так, как ты говоришь. Если взорвать Mesh (предварительно установив сглаживание в 1-4 позиции), а потом все полученное опять превратить в кучу маленьких Mesh, а потом опять взорвать и т.д. мы шаг за шагом будем улучшать форму поверхности. Но кончная стадия - треугольники, а перед ними 3Dface. Вот раз есть 3Dface, так надо его как два треугольника считать, а не конвертировать, взрывать, опять конвертировать... так когда же считать? Площадь круга тоже не совсем круга. Я был прав! ![]() Оказывается площадь Mesh меряется командой _.area и я померил ею, а потом разбил Mesh на 3Dface-ы и своей функцией замерил, предварительно установив 6 знаков точности. Все совпало до 6 знака! А... собственно говоря, почему _.area меряет площадь Mesh, а GeomProps нет? Последний раз редактировалось Supermax, 30.10.2010 в 22:34. |
||||
![]() |
|
||||
Ты действительно проверял на 3Dface не лежащем в одной плоскости и имеющим большой излом?
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Сначала я нарисовал большой 3Dface и потянул за один конец по Z. Покрутил, покрутил и конвертнул в Mesh. Потом много всякого было, а потом я его взорвал. Этот Mesh развалился на 4 меньших 3Dface. Все они изогнутые. Специально сейчас померял в фас на 5 и в профиль на 8 градусов. Это малова-то но я сйчас специальный файлец сюда выложу.
Ждите. Вот, задрал угол до небес и конвертнул в Mesh (почти стих). Там все площади проставлены. Сделал функцию, которая считает два треугольника (1-2-4)+(2-3-4), затем два противоположных (1-2-3)+(3-4-1) и сумму обеих площадей делит пополам. Погрешность вместо того, чтобы уменьшиться - увеличилась и сразу на много. Даю файл, правильный! Очень трудно было 6 знаков вытаскивать. Пришлось результат в переменные загнать и просуммировать полученное, а потом уж вытаскивать 6 знаков после запятой. Считаю доказанным, что команда _area именно так и меряет Mesh! Последний раз редактировалось Supermax, 28.10.2010 в 10:35. |
||||
![]() |
|
||||
Неправильно конвертирован 3Dface в surface. Излом в 3Dface по 2 и 4 точкам, а в surface по 1 и 3 точке 3Dface-а.
Если обвести твой surface 3Dface-ом, проконтролировав, что излом будет тамже, то площади будут равны. |
||||
![]() |
|
||||
обвел - проверяй!
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Ты бы хоть раскраску включил и посмотрел, что ты обвел. Пишу ведь, Проконтролировать!. Опять у тебя грань не там образовалась!
Измени порядок действий при обведении! Вот твой файл и внизу правильно обведенный 3Dface. Последний раз редактировалось Supermax, 28.10.2010 в 15:33. |
||||
![]() |
|
||||
Действительно, если поменять порядок вершин, то твоя версия правильно считает площадь сплющенного 3dface...
ps. на мой вкус, это не самая верная площадь - правильнее, использовать сглаженную поверхность.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны. /Сунь Цзы/ |
||||
![]() |
|
||||
Не, не, не! Секундочку!
Есть объект Mesh. У него в окне свойств, в закладке Geometry есть такое свойство Smoothness (Гладкость). Там 5 позиций от "нет" до "4". А теперь, внимание! В зависимости что выбрано в этом свойстве одна грань Mesh разбивается либо на один 3Dface, либо 4, 16, 64, 256. В каждом случае команда _.area показывает разные значения площади. Что это означает? - Это означает, что площадь меряется не по гипотетическим, математическим представлениям о том как это в идеале должно быть, а по факту существующей апроксимации. Какая апроксимация - такая и площадь поверхности. Чтобы окончательно "поставить точки над и" я сделал кусок тора типа Mesh и размножил до двух экземляров. Первому сделал свойство Smoothness "нет" замерял через _.area площадь, скопировал рядом, взорвал и замерял своей функцией (с небольшой надстройкой) общую площадь полученных 3Dface. Второму экземпляру сделал свойство Smoothness "4" и далее сделал тоже, что и в первом случае. Вот надстройка для функции, чтобы можно было создать набор и все там перемерять. Код:
;============================================== 29.10.10 Пример с торами не удачный. Там все 3Dface плоские. Даю другой прмер. Там почти все 3Dface изломаны и абсолютное совпадение площади прототипа (Mesh) и общей площади полученной поверхности из 3Dface. Последний раз редактировалось Supermax, 29.10.2010 в 16:23. |
||||
![]() |
|
||||
Добавил обработку AcDbBody, AcDbSubDMesh, AcDbPolygonMesh, AcDbPolyFaceMesh и подсчет площади AcDbFace по "методу Supermax"
Версии под AutoCAD 2008,2009,2010...? во вложении. На сайт пока выкладывать не буду - тестируйте. Последний раз редактировалось Александр Ривилис, 02.11.2010 в 16:20. |
||||
![]() |
|
||||
Выложил версию на сайте. Добавил возможность динамического включения/выключения расчета геометрических свойств (команды GeomPropsStart и GeomPropsStop), т.к. далеко не всегда есть необходимость получать эти свойства по всем выбранным объектам, а их вычисление тормозит и достаточно существенно работу в AutoCAD.
|
||||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Александр Ривилис, Александр, спасибо. В качестве пожеланий добавить в архив readme про оманды GeomPropsStart и GeomPropsStop.
И еще один вопрос по функционированию. До сих пор, когда собирался выбирать большой объем данных, я закрывал окно свойств. Так вот вопрос: работает ли Geomprops, если окно свойств закрыто?
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Нет. AutoCAD не обращается к GeomProps если окно свойств закрыто. Но команды включения/выключения GeomProps я сделал по той причине, что иногда нужно при открытой панели свойств выбрать много примитивов (например, если нужно убедится, что выбранные примитивы на одном слое).
Но вызывать функции, которые из позволяют получить площадь/периметр/объем примитивов из LISP/VBA можно и при закрытом окне свойств. |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Вставка в таблицу поля, соотвествующего площади примитива | Profan | Готовые программы | 272 | 06.06.2021 23:12 |
Площади в Archicad | alven | ArchiCAD | 25 | 25.02.2015 15:22 |
Отношение площади световых проемов к площади пола | lee | Архитектура | 45 | 26.01.2011 06:54 |
DwgRuLispLib: Геометрия. Вычисление центра масс (centroid) LW полилинии | VVA | Библиотека функций | 2 | 16.11.2010 09:49 |
Как считаются машино-места в парковке для торговой площади? По Общ. или аренд.площади? | kolja | Архитектура | 4 | 06.09.2010 13:05 |