только файлы возьмите из гитхаба
Фришип (Лазарус). Ошибки программы, исправления и улучшения.
#577
Отправлено 14 мая 2020 - 05:42
Отвлекся тут на прикладной проект. Цельный день модельку клеил.
Получается у меня непонятка с кодом по треугольным граням.Если брать вот эту формулу для 4 треугольных граней (a := 5 / 3 - 8 / 3 * sqr(3 / 8 + 1 / 4 * cos(2 * Pi / FFaces.Count)) ), то 1 / 4 * cos(2 * Pi / FFaces.Count (4)=0, соответственно останется a := 5 / 3 - 8 / 3 * sqr(3 / 8)=0,03367
а далее из формулы Result. := FCoordinate. + a * (Result. - FCoordinate.) получается что точка почти никуда не переместится, а на деле то там половина Result. - FCoordinate
Немного там еще вес граней вмешивается, но это не сильно на результат влияет.
Чет я где то в коде пропустил?
#578
Отправлено 14 мая 2020 - 17:27
Отвлекся тут на прикладной проект. Цельный день модельку клеил.
Получается у меня непонятка с кодом по треугольным граням.Если брать вот эту формулу для 4 треугольных граней (a := 5 / 3 - 8 / 3 * sqr(3 / 8 + 1 / 4 * cos(2 * Pi / FFaces.Count)) ), то 1 / 4 * cos(2 * Pi / FFaces.Count (4)=0, соответственно останется a := 5 / 3 - 8 / 3 * sqr(3 / 8)=0,03367
а далее из формулы Result. := FCoordinate. + a * (Result. - FCoordinate.) получается что точка почти никуда не переместится, а на деле то там половина Result. - FCoordinate
Немного там еще вес граней вмешивается, но это не сильно на результат влияет.
Чет я где то в коде пропустил?
Я уж переживать стал, не вирус-ли...
Что значит "половина"?
#579
Отправлено 14 мая 2020 - 18:51
Я уж переживать стал, не вирус-ли...
Что значит "половина"?
Применительно к граням, так как расчет по ним, даже не так. Вот моделька, ФШ, сетка и меш собственно. Нас интересует центральная точка (выделена) которая окружена 4 треугольными гранями. Далее акад. Первый шаг-разделение-показан оранжевым. Соответственно нас интересуют пять оранжевых точек, из ценральной мы должны получить зеленую. Голубые-это Centre граней (с учетом весов 1/4 и 3/8), фиолетовая-Result=Result/TotalWeight, а синяя (выделена на последнем скрине) -это та что получается с корректировкой Result=FCoordinate+a*(Result-FCoordinate) где a=0.03367 по формуле выше. А должно для этого варианта a=1.72
Уж все вроде пробежал на насколько раз, где я ошибся не пойму.
P/S схему немного не так нарисовал, ща подправлю
Сообщение отредактировал a_max: 14 мая 2020 - 19:26
#582
Отправлено 15 мая 2020 - 03:00
трудно понять...
а где синяя на последнем рис?
Да почти в том же месте что и исходная ( 0,0031 0,9968 0,5 ).При таком (a) другого и получиться не может.
Причем геометрически все просто. Поскольку тут в отличие от 2д искомую точку окружают 4 соседние а не две (по ребрам), то берется половина расстояния между их средними попарно. Голубые линии. Но поскольку расчет идет по граням, то точка получается ближе чем надо, и ее надо откорректировать коэффициентом (a).Но вот с ним какая то засада.
Сообщение отредактировал a_max: 15 мая 2020 - 03:21
#585
Отправлено 15 мая 2020 - 23:07
ну, если даже в первом, алгоритм для всех уровней.
поправка зависит как то от уровня СД. для первого, она больше, для последующих меньше ...
Ну фактически то да, но относительно она не меняется. Суть метода что ControlFace с любым количеством точек распадаются на 3 и 4 угольные грани, и дальше они только делатся на 3 и 4 новые каждый раз. Вы в моем чтении формулы в коде никаких ошибок не видите?
#586
Отправлено 16 мая 2020 - 20:49
Сделал пирамидку из четырех треуг граней.
Измерил высоту центральной точки меша (соответствует вершине пирамидки)
для высот пирамидки от 0.2 до 0.8, шаг 0.1; для СД уровней 1(low),2(med),3(hig).
Получил, y3/y=0.4375..., a y3/y1 = 0.85
Сообщение отредактировал mm7: 16 мая 2020 - 20:52
#587
Отправлено 16 мая 2020 - 20:53
Сделал пирамидку из четырех треуг граней.
Измерил высоту центральной точки меша (соответствует вершине пирамидки)
для высот пирамидки от 0.2 до 0.8, шаг 0.1; для СД уровней 1(low),2(med),3(hig).
Получил, y3/y=0.4375..., a y3/y1 = 0.85
Чет не очень понял.Понятно что будет зависимость от исходных точек.Но считаем мы вроде же только по шагам. Из Mid получаем Hi, а то что было в Low здесь не учитывается вообще.
#591
Отправлено 17 мая 2020 - 04:55
Я убрал корректор
А, понял какая у вас модель. Могу на ней просчитать точки. Но думаю не изменится ничего. Мы можем по коду пробежать, начиная с первого шага, в каких он функциях? А то я уже не пойму почему не сходится. Причем именно для треугольников. Может счетчики считают не с 1 а с 0. А я не улавливаю где.
Скинте ваш файл, я его в акад перекину.
#593
Отправлено 18 мая 2020 - 03:35
Есть две ф-ии Subdivide и Averaging. Они так и вызываются для каждого уровня СД.
У нас открыли клуб! Я поехал кататься!
Круто! А у нас одни ограничения.
Процедур Subdivide там как то несколько.TFreeSubdivisionFace.Subdivide,TFreeSubdivisionControlFace.Subdivide,TFreeSubdivisionSurface.SubDivide
За первый шаг я так понял первая из перечисленных отвечает?
Сообщение отредактировал a_max: 18 мая 2020 - 04:06
#595
Отправлено 19 мая 2020 - 01:31
TFreeSubdivisionSurface.SubDivide на строке 4943 вызывает TFreeSubdivisionControlFace.Subdivide , а она на стр 1558 вызывает TFreeSubdivisionFace.Subdivide
Пробовал разобраться, но чет не очень успешно . В первом вроде что то с поиском центра, в треугольных и остальных ControlFace, а в других вообще непонятно. Можно вкратце как работает все вкупе? Вроде ControlFace для этого алгоритма единица так скажем. т.е. для каждой должны произвестись какие то действия и на выходе получиться результат.
#596
Отправлено 19 мая 2020 - 16:40
Пробовал разобраться, но чет не очень успешно . В первом вроде что то с поиском центра, в треугольных и остальных ControlFace, а в других вообще непонятно. Можно вкратце как работает все вкупе? Вроде ControlFace для этого алгоритма единица так скажем. т.е. для каждой должны произвестись какие то действия и на выходе получиться результат.
TFreeSubdivisionSurface.SubDivide - собирает существующие объекты в массивы как реф объекты, находит средние точки граней и ребер. Для первого уровня с самих ControlFaces, для следующих с ChildFaces - это подразделенная сеть.
Со всеми этими реф массивами вызыватся TFreeSubdivisionControlFace.Subdivide. Потом производится чистка.
TFreeSubdivisionControlFace.Subdivide - в общем мало что делает, вызывает TFreeSubdivisionFace.Subdivide.
TFreeSubdivisionFace.Subdivide - для точки грани ищет ее ребра в реф-массивах, и их другие точки, собирает грани следующего уровня.
Для тругольных, если FSubdivisionMode <> fmCatmullClark , грани собираются специальным "треугольным" алгоритмом
#597
Отправлено 19 мая 2020 - 17:22
TFreeSubdivisionSurface.SubDivide - собирает существующие объекты в массивы как реф объекты, находит средние точки граней и ребер. Для первого уровня с самих ControlFaces, для следующих с ChildFaces - это подразделенная сеть.
Со всеми этими реф массивами вызыватся TFreeSubdivisionControlFace.Subdivide. Потом производится чистка.
TFreeSubdivisionControlFace.Subdivide - в общем мало что делает, вызывает TFreeSubdivisionFace.Subdivide.
TFreeSubdivisionFace.Subdivide - для точки грани ищет ее ребра в реф-массивах, и их другие точки, собирает грани следующего уровня.
Для тругольных, если FSubdivisionMode <> fmCatmullClark , грани собираются специальным "треугольным" алгоритмом
Когда мы нашли новые точки граней и ребер, потом мы должны их соединить попарно ребрами. Это уже в TFreeSubdivisionFace.Subdivide? Что значит собирает? Это и есть соединение ребрами с образованием грани?
Ответить
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 скрытых пользователей