| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
27.10.2010, 15:29 | #1 | |
Вычисление площади 3Dface, Mesh и PolygonMesh
Руководитель фирмы
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
|
||
Просмотров: 8475
|
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,992
|
Если захочешь второе, вот тебе 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. Вставка в таблицу поля, соотвествующего площади примитива | 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 |