1

У меня есть список треугольников в 3D, которые образуют поверхность (триангуляцию). Структура представляет собой деформированную треугольную решетку. Я хочу знать изменение площади деформированных шестиугольников вороненой решетки решетки относительно площади покоя недеформированных клеток решетки (т. Е. Относительно правильного шестиугольника). На самом деле, я действительно хочу получить сумму квадратов изменения площади гексагональных элементарных ячеек, связанных с этими треугольниками.Суммируя квадрат области изменения из клеток Вороной данных области треугольников в 3D?

Area of deformed hexagon

Предпосылки/Математические детали: Я аппроксимирующих изогнутый упругий лист на треугольной решетке. Один из способов настройки отношения пуассонов (эластичной константы) листа заключается в добавлении к энергии «объемного» энергетического термина. Я пытаюсь вычислить «объемную» энергию деформации деформированной упругой треугольной решетки, определяемую как: U_volumetric = 1/2 T (e_v)^2, где e_v = deltaV/V определяется изменением площади клетка voronoi относительно своей контрольной области, которая является известной константой.

Ссылка: https://www.researchgate.net/publication/265853755_Finite_element_implementation_of_a_non-local_particle_method_for_elasticity_and_fracture_analysis

Want:

Sum[ (DeltaA/ A).^2 ] над всеми шестиугольными ячейками.

Мои данные хранятся в переменных:

xyz = [ x1,y1,z1; x2,y2,z2; etc] % с вершины/частиц в 3D

TRI = [ vertex0, vertex1, vertex2; etc] % , где находится vertex0 строку xyz для частицы, сидел на vertex 0 первого треугольника.

NeighborList = [ p1n1, p1n2, p1n3, p1n4, p1n5,p1n6 ; p2n1...] % где p1n1 является первым ближайшим соседом частицы 1 в качестве индекса строки для xyz. Например, xyz(NL(1,1),:) возвращает xyz местоположение первого соседа частицы 1.

AreaTRI = [ areaTRI1; areaTRI2; etc]

Я пишу это в MATLAB.

На данный момент я сравниваю количество областей, приписываемых каждой вершине, как 1/3 площади треугольника, а затем суммируя по 6 ближайшим соседним треугольникам. Но область клеток voronoi НЕ будет точно равна Sum_ (i = 0,1, ... 5) 1/3 * areaTRI_i, поэтому это плохое приближение. См. Изображение в приведенной выше ссылке, что, я думаю, делает это более ясным.

+0

Изменение в отношении чего? Также: не могли бы вы предоставить нам изображение? – knedlsepp

+0

* Суммируя квадрат изменения области * vs. * Я хочу знать изменение объема *, Что вы хотите знать? Возможно, мы также можем предоставить нам основную математику. – knedlsepp

+0

@knedlsepp: Я разместил изображение здесь: http://s1167.photobucket.com/user/npmitchell/media/Slide1_zpsyhqg9tvb.jpg.html – NPMitchell

ответ

0

Вы можете сделать это с помощью DUALMESH -submission на обмен файлов:

DUALMESH является инструментарием обработки сетки процедур, которые позволяют построить «двойные» сеток на основе базовой симплициальной триангуляции. Поддержка обеспечивается для различных типов планарной и поверхностной триангуляции, включая типы не-Delaunay и не-коллекторы.

Просто используйте следующие команды для создания вектора areas всех областей двойственных элементов. Порядок будет соответствовать узлам xyz.

[cp,ce,pv,ev] = makedual2(xyz, TRI); 
[~,areas(cp(:,1))] = geomdual2(cp,ce,pv,ev); 

Вы можете посмотреть на граничных областях с использованием:

trisurf(TRI, xyz(:,1), xyz(:,2), areas); 

Двойные клетки граничных узлов теоретически неограничены и, таким образом, должен иметь бесконечную площадь. Однако это представление обрабатывается иначе: вместо неограниченной ячейки он вернет пересечение неограниченной ячейки с исходной сеткой.

Также помните, что ваш вопрос нечетко определен, если сетка, с которой вы работаете, не является плоской, так как ячейки с двумя ячейками будут плоскими и не будут масштабироваться так же, как треугольники. Таким образом, это решение, вероятно, будет работать только правильно, если ваша сетка действительно 2D. (Из того, что я могу сказать, документ, который вы упомянули, также относится только к 2D-футляру.)