Перейти к содержимому

Фотография
- - - - -

Фришип (Лазарус). Ошибки программы, исправления и улучшения.

FreeShip Lazarus

Сообщений в теме: 825

#576 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 11 мая 2020 - 15:45

только файлы возьмите из гитхаба


  • 0

#577 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 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

Немного там еще вес граней вмешивается, но это не сильно на результат влияет.

Чет я где то в коде пропустил? :)


  • 0

#578 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 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

Немного там еще вес граней вмешивается, но это не сильно на результат влияет.

Чет я где то в коде пропустил? :)

Я уж переживать стал, не вирус-ли... :)

Что значит "половина"?


  • 0

#579 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 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 схему немного не так нарисовал, ща подправлю

Прикрепленные изображения

  • triang_surf_net.JPG
  • triang_surf_mesh.JPG
  • triang_points.JPG
  • triang_point_result.JPG

Сообщение отредактировал a_max: 14 мая 2020 - 19:26

  • 0

#580 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 14 мая 2020 - 19:37

Вот, не по тем точкам первый шаг сделал.Поправил, но вопрос остался. a=1.29 нужно получается

Прикрепленные изображения

  • triang_points.JPG

  • 0

#581 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 15 мая 2020 - 01:53

трудно понять...
а где синяя на последнем рис?

 


  • 0

#582 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 15 мая 2020 - 03:00

трудно понять...
а где синяя на последнем рис?

 

Да почти в том же месте что и исходная ( 0,0031 0,9968 0,5 ).При таком (a) другого и получиться не может.

Причем геометрически все просто. Поскольку тут в отличие от 2д искомую точку окружают 4 соседние а не две (по ребрам), то берется половина расстояния между их средними попарно. Голубые линии. Но поскольку расчет идет по граням, то точка получается ближе чем надо, и ее надо откорректировать коэффициентом (a).Но вот с ним какая то засада.

Прикрепленные изображения

  • point_result.JPG
  • point_centre.JPG

Сообщение отредактировал a_max: 15 мая 2020 - 03:21

  • 0

#583 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 15 мая 2020 - 18:10

Еще вот кстати странное условие- if (Nq=0) and (Nt=3) then.  Это как вообще можно получить в такой модели чтоб к точке примыкали только 3 треугольных грани?Может ответ в первом шаге где то? За него какая функция отвечает?


  • 0

#584 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 15 мая 2020 - 22:31

ну, если даже в первом, алгоритм для всех уровней.

поправка зависит как то от уровня СД. для первого, она больше, для последующих меньше ...

 


  • 0

#585 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 15 мая 2020 - 23:07

ну, если даже в первом, алгоритм для всех уровней.

поправка зависит как то от уровня СД. для первого, она больше, для последующих меньше ...

 

Ну фактически то да, но относительно она не меняется. Суть метода что ControlFace с любым количеством точек распадаются на 3 и 4 угольные грани, и дальше они только делатся на 3 и 4 новые каждый раз. Вы в моем чтении формулы в коде никаких ошибок не видите?  


  • 0

#586 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 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

Прикрепленные изображения

  • Screenshot_2020-05-16_12-51-17.png
  • Screenshot_2020-05-16_12-51-34.png

Сообщение отредактировал mm7: 16 мая 2020 - 20:52

  • 0

#587 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 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 здесь не учитывается вообще.


  • 0

#588 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 16 мая 2020 - 21:19

зависимость Y1 я увидел только от Y верхней точки. При двигании нижних точек по X Y1 не меняется.


  • 0

#589 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 16 мая 2020 - 22:12

зависимость Y1 я увидел только от Y верхней точки. При двигании нижних точек по X Y1 не меняется.

У вас сейчас корректор вмешивается, в родном алгоритме так не построится


  • 0

#590 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 17 мая 2020 - 04:17

Я убрал корректор


  • 0

#591 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 17 мая 2020 - 04:55

Я убрал корректор

А, понял какая у вас  модель. Могу на ней просчитать точки. Но думаю не изменится ничего. Мы можем по коду пробежать, начиная с первого шага, в каких он функциях? А то я уже не пойму почему не сходится. Причем именно для треугольников. Может счетчики считают не с 1 а с 0. А я не улавливаю где.

Скинте ваш файл, я его в акад перекину.


  • 0

#592 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 17 мая 2020 - 18:06

Есть две ф-ии Subdivide и Averaging. Они так и вызываются для каждого уровня СД.

 

У нас открыли клуб! Я поехал кататься!


  • 0

#593 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 18 мая 2020 - 03:35

Есть две ф-ии Subdivide и Averaging. Они так и вызываются для каждого уровня СД.

 

У нас открыли клуб! Я поехал кататься!

Круто! А у нас одни ограничения. 

Процедур Subdivide там как то несколько.TFreeSubdivisionFace.Subdivide,TFreeSubdivisionControlFace.Subdivide,TFreeSubdivisionSurface.SubDivide

За первый шаг я так понял первая из перечисленных отвечает?


Сообщение отредактировал a_max: 18 мая 2020 - 04:06

  • 0

#594 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 18 мая 2020 - 19:53

TFreeSubdivisionSurface.SubDivide на строке 4943 вызывает TFreeSubdivisionControlFace.Subdivide , а она на стр 1558 вызывает TFreeSubdivisionFace.Subdivide


  • 0

#595 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 19 мая 2020 - 01:31

TFreeSubdivisionSurface.SubDivide на строке 4943 вызывает TFreeSubdivisionControlFace.Subdivide , а она на стр 1558 вызывает TFreeSubdivisionFace.Subdivide

Пробовал разобраться, но чет не очень успешно :) . В первом вроде что то с поиском центра, в треугольных и остальных ControlFace, а в других вообще непонятно. Можно вкратце как работает все вкупе? Вроде ControlFace для этого алгоритма единица так скажем. т.е. для каждой должны произвестись какие то действия и на выходе получиться результат.


  • 0

#596 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 19 мая 2020 - 16:40

Пробовал разобраться, но чет не очень успешно :) . В первом вроде что то с поиском центра, в треугольных и остальных ControlFace, а в других вообще непонятно. Можно вкратце как работает все вкупе? Вроде ControlFace для этого алгоритма единица так скажем. т.е. для каждой должны произвестись какие то действия и на выходе получиться результат.

TFreeSubdivisionSurface.SubDivide - собирает существующие объекты в массивы как реф объекты, находит средние точки  граней и ребер. Для первого уровня с самих ControlFaces, для следующих с ChildFaces - это подразделенная сеть.

Со всеми этими реф массивами вызыватся TFreeSubdivisionControlFace.Subdivide. Потом производится чистка.

 

TFreeSubdivisionControlFace.Subdivide - в общем мало что делает, вызывает TFreeSubdivisionFace.Subdivide.

 

TFreeSubdivisionFace.Subdivide - для точки грани ищет ее ребра в реф-массивах, и их другие точки, собирает грани следующего уровня.

Для тругольных, если FSubdivisionMode <> fmCatmullClark , грани собираются специальным "треугольным" алгоритмом


  • 0

#597 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 19 мая 2020 - 17:22

TFreeSubdivisionSurface.SubDivide - собирает существующие объекты в массивы как реф объекты, находит средние точки  граней и ребер. Для первого уровня с самих ControlFaces, для следующих с ChildFaces - это подразделенная сеть.

Со всеми этими реф массивами вызыватся TFreeSubdivisionControlFace.Subdivide. Потом производится чистка.

 

TFreeSubdivisionControlFace.Subdivide - в общем мало что делает, вызывает TFreeSubdivisionFace.Subdivide.

 

TFreeSubdivisionFace.Subdivide - для точки грани ищет ее ребра в реф-массивах, и их другие точки, собирает грани следующего уровня.

Для тругольных, если FSubdivisionMode <> fmCatmullClark , грани собираются специальным "треугольным" алгоритмом

Когда мы нашли новые точки граней и ребер, потом мы должны их соединить попарно ребрами. Это уже в TFreeSubdivisionFace.Subdivide? Что значит собирает? Это и есть соединение ребрами с образованием грани?


  • 0

#598 mm7

mm7

    Рулевой 1-го класса

  • Основной экипаж
  • PipPipPipPipPipPip
  • 473 сообщений
  • Из:Вудбридж
  • Судно: виндфойл доска

Отправлено 19 мая 2020 - 17:38

Когда мы нашли новые точки граней и ребер, потом мы должны их соединить попарно ребрами. Это уже в TFreeSubdivisionFace.Subdivide? Что значит собирает? Это и есть соединение ребрами с образованием грани?

да


  • 0

#599 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 19 мая 2020 - 18:06

да

Понятно.Ну пока вроде все не расходится с геометрией. т.е. мы получили новую сеть, в которой уже только 3 и 4 угольные грани. Значит все таки с average надо разбираться.


  • 0

#600 a_max

a_max

    Яхтенный капитан

  • Капитан
  • 2 842 сообщений
  • Из:moscow

Отправлено 19 мая 2020 - 18:48

Вот еще вопрос. При отладке как то можно выводить промежуточные результаты (эти вот реф-массивы), типа мы можем на первом шаге разделения притормозить, и вывести в виде точек  до average?


  • 0



Ответить



  


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей