Стандартная сетка для вогнутых шестиугольников с двумя горлами?

Я планирую визуализацию потоков через вогнутые бисимметричные шестиугольники с двумя устьями.

Пример, когда длина стороны d1 равна другой длине стороны d2:

введите здесь описание изображения

какое наименование я обсуждал первоначально здесь о неправильных шестиугольниках.

Существует стандартный инструмент Mesh, в котором вы можете рисовать свои собственные сетки, но мне бы хотелось иметь какую-то стандартную библиотеку, чтобы я мог лучше сотрудничать с другими при моделировании потока позже. Я не нашел никакой библиотеки Mesh для Hexagons в MathCentral File Exchange здесь.

Есть ли стандартная библиотека Mesh для неправильных шестиугольников? Я также открыт для любых других языков, потому что я мог прочитать код и преобразовать его в эти стандарты в библиотеку Matlab.


person Léo Léopold Hertz 준영    schedule 23.05.2015    source источник


Ответы (5)


Например, вы можете взглянуть на пример, сделанный Александрой Баумгарт и Хадзуки Окуда с использованием Mathematica. Это реализуется с помощью Manipulate, эффективно создавая базовую Пользовательский интерфейс.

введите здесь описание изображения

Код:

Manipulate[
Grid[{{Show[
ParametricPlot3D[{1.25Cos[t], 1.25 Sin[t],s+2-2w},{s,0,.25},{t,0,2Pi},PlotStyle->Directive[Opacity[1],Gray],Mesh->None, Lighting->"Neutral"], 
ParametricPlot3D[{r Cos[t], r Sin[t],2.25-2w},{r,0,1.25},{t,0,2Pi},PlotStyle->Directive[Opacity[1],Gray],Mesh->None, Lighting->"Neutral"],
ParametricPlot3D[{r Cos[t], r Sin[t],2-2w},{r,0,1.25},{t,0,2Pi},PlotStyle->Directive[Opacity[1],Gray],Mesh->None, Lighting->"Neutral"],
ParametricPlot3D[{1.25Cos[t], 1.25 Sin[t],s-2.25+2w},{s,0,.25},{t,0,2Pi},PlotStyle->Directive[Opacity[1],Gray],Mesh->None, Lighting->"Neutral"],
ParametricPlot3D[{r Cos[t], r Sin[t],-2.25+2w},{r,0,1.25},{t,0,2Pi},PlotStyle->Directive[Opacity[1],Gray],Mesh->None],
ParametricPlot3D[{r Cos[t], r Sin[t],-2+2w},{r,0,1.25},{t,0,2Pi},PlotStyle->Directive[Opacity[1],Gray],Mesh->None, Lighting->"Neutral"],  
ParametricPlot3D[{(1-s/2) Cos[t],(1-s/2) Sin[t],Max[0,-s+2 ]},{s,Min[2-(2^(2/3) (2 \[Pi]-Min[2Pi,3 V((w^2)/(.04))])^(1/3))/\[Pi]^(1/3)-w,1.99],2},{t,0, 2 Pi},PlotStyle->Directive[Opacity[1],Hue[a]],Mesh->None, Lighting->"Neutral"],
ParametricPlot3D[{r Cos[t], r Sin[t],Max[0,(2^(2/3) (2 \[Pi]-Min[2Pi,3 V((w^2)/(.04))])^(1/3))/\[Pi]^(1/3)-w]},{r,0, .000000000001+w+((2^(2/3) (2 \[Pi]-Min[2Pi,3 V((w^2)/(.04))])^(1/3))/\[Pi]^(1/3)-w)/2},{t,0,2Pi},PlotStyle->Directive[Opacity[1], Hue[a]],Mesh->None, Lighting->"Neutral"],
ParametricPlot3D[{r Cos[t], r Sin[t], Min[0,-(2^(2/3) (2 \[Pi]-Min[2Pi,3 V((w^2)/(.04))])^(1/3))/\[Pi]^(1/3)]},{r, 0, .00000000001+w+((2^(2/3) (2 \[Pi]-Min[2Pi,3 V((w^2)/(.04))])^(1/3))/\[Pi]^(1/3)-w)/2},{t,0,2Pi},PlotStyle->Directive[Opacity[1],Hue[a]],Mesh->None, Lighting->"Neutral"],
ParametricPlot3D[{(1-s/2) Cos[t],(1-s/2) Sin[t],Min[0,s -2 ]},{s,w,2},{t,0, 2 Pi},PlotStyle->Directive[Opacity[.2],Gray],Mesh->None, Lighting->"Neutral"],ParametricPlot3D[{(1-s/2) Cos[t],(1-s/2) Sin[t],Max[0,-s + 2 - w]},{s,w,2},{t,0, 2 Pi},PlotStyle->Directive[Opacity[.2],Gray],Mesh->None, Lighting->"Neutral"], 
ParametricPlot3D[{(1-s/2) Cos[t],(1-s/2) Sin[t],Min[0,s-2+ w]},{s,w,Min[2-(2^(2/3) (2 \[Pi]-Min[2Pi,3 V((w^2)/(.04))])^(1/3))/\[Pi]^(1/3)-w,2]},{t,0, 2 Pi},Mesh->None, PlotStyle->Directive[Opacity[1],Hue[a]], Lighting->"Neutral"],  ParametricPlot3D[{(w/2) Cos[t],(w/2) Sin[t], b},{t,0,2Pi}, {b, -2 + w, 0}, PlotStyle->Directive[Opacity[1], Hue[a]],Mesh->None, Lighting->"Neutral"],PlotRange->All,ImageSize->{300,300}, SphericalRegion-> True]},{Row[{Text["time to empty = "], Text[2Pi (.04)/(3w^2)],Text[" seconds"]}]}}],{start,ControlType->None},{end,ControlType->None},
{{V,.01,"time (seconds)"},0.01,34,.01,ControlType->Animator,AnimationRate->1,AnimationRunning->False,ImageSize->Small}, 
{{w,.05,"neck width (millimeters)"}, .05, .3,.01,Appearance->"Labeled"}, 
{{a,0,"color of sand"}, 0, 1,Appearance->"Labeled"}]

Источник: http://demonstrations.wolfram.com/FlowTimeInAnHourglass/

person Margus    schedule 25.06.2015
comment
Хороший! Даже более простая сетка была бы хороша, если бы не морфология песочных часов. Требуется только простой вогнутый шестигранник с двойными горловинами. Некоторые простые, чтобы их можно было использовать в качестве стандарта позже. Сравнение должно быть сделано, чтобы объяснить, почему избранный будет лучше, чем кто-либо другой. Было бы неплохо, если бы вы могли упростить предложение. - person Léo Léopold Hertz 준영; 25.06.2015
comment
Сравнение должно быть сделано, чтобы объяснить, почему выбранный будет лучше, чем кто-либо другой. Ну, тогда вы должны иметь представление о том, что лучше (обычно вы этого не знаете). В реальной жизни я знаю, что эта проблема решается немного по-другому. Я думаю, это называлось итеративным обучением, в основном вы рандомизируете параметры и проверяете, насколько хорошо они работают. После этого вы повторяете, но отдаете предпочтение набору параметров, которые до сих пор работали хорошо. Вы также можете обучить нейронную сеть с обратной связью, чтобы сделать это за вас. - person Margus; 26.06.2015
comment
Ну конечно; естественно. Вот почему эта тема здесь, чтобы получить какой-то стандарт. Чтобы получить идеи и причины, почему что-то лучше, чем другое. Приветствуется любой способ объяснения! - person Léo Léopold Hertz 준영; 26.06.2015

Если это просто замена уровня представления, то это действительно зависит от вывода моделирования и представления, которое вы для него выбираете.

Например, если моделирование выводит одну единственную переменную (например, объем одного из отсеков), то ее можно присвоить непосредственно атрибуту визуализации, такому как расположение «верхней» крышки цилиндра. «Дополнительный» цилиндр может стоять поверх предыдущего с координатами его нижней крышки, назначенными (totalVolume-lowerCompartmentVolume).

В этом случае визуализация представляет собой просто информационную панель и не учитывается при моделировании (например, столкновение объектов или близость в целом не учитываются при моделировании).

Обобщая это, мы говорим о решении, в котором набор величин назначается набору атрибутов визуализации.

С этой точки зрения набор сложных объектов может быть создан с использованием VRML (или X3D), их атрибуты могут быть привязаны непосредственно к результатам моделирования, а рендеринг будет запускаться каждый n-й временной шаг моделирования.

Чтобы создать «сцену» или объекты визуализации, вы можете использовать программное обеспечение, такое как blender, которое может экспортировать сцены VRML, или напишите VRML вручную (это действительно простая задача).

Что касается инфраструктуры, у MATLAB есть инструментарий VRML, а у Python действительно широкий выбор модулей, с помощью которых можно обрабатывать VRML (см. это и эту ссылку, например).

Для более конкретного примера:

Учитывая некоторые результаты моделирования y и файл шаблона VRML, например:

#VRML V2.0 utf8
Transform {
  translation 0 0 0
  children [
    Shape { geometry Box {2,2,zSize} }
  ]
}

Вы можете сделать что-то вроде:

data = (Read contents of VRML file as string data).
for n in [0..1000]:
    y = getSimulationOutput(aParameterVector)
    renderData = substitute(data, "zSize", y) #This function could be provided by a template module like jinja for example. 
    simulationFrame = renderVRML(renderData)
    saveImage(simulationFrame)

(Обратите внимание: дополнительную информацию о Jinja можно найти здесь — встроенная ссылка комментария выше не отображается должным образом.)

Вернувшись в файл и привязав различные элементы к разным величинам (например, изменив преобразование, которое может поворачивать, масштабировать, перемещать блок или изменять внешний вид блока, назначая другой цвет), вы можете создать любой вид " панель инструментов" для вашей симуляции.... включая неправильные шестиугольники.

Этот метод представляет собой прямое применение документов, управляемых данными, но на другой основе (чем HTML или SVG).

Надеюсь это поможет.

person A_A    schedule 26.06.2015
comment
Хороший ответ! В предпоследнем предложении в слове here отсутствует ссылка? - person Léo Léopold Hertz 준영; 26.06.2015
comment
Спасибо, нет, здесь не подразумевается ссылка в этом случае, это означает, что это, по сути, метод D3, но в этом случае он применяется на другом субстрате, чем обычный HTML / SVG. - person A_A; 26.06.2015

Если ваша цель — визуализировать такие шестиугольники в Matlab, то fill и fill3 должно помочь. Вот пример кода, который предполагает, что ваши шестиугольники параметризованы двумя ширинами w1 и w2 и параметрами d1 и d2, которые являются длинами сторон:

function draw_hexagon(w1, w2, d1, d2)
    a=(w1-w2)/2;
    b1=sqrt(d1^2 - a^2);
    b2=sqrt(d2^2 - a^2);

    xs=[-w1/2, w1/2, w2/2, w1/2, -w1/2, -w2/2];
    ys=[b1, b1, 0, -b2, -b2, 0];

    fill(xs, ys, 'b')
    axis square 
    grid on
end

Это произведет следующее для w1=4, w2=2, d1=2, d2=3:

введите здесь описание изображения

И аналогично для 3D:

function draw_hexagon_3d(w1, w2, d1, d2)
    a=(w1-w2)/2;
    b1=sqrt(d1^2 - a^2);
    b2=sqrt(d2^2 - a^2);

    xs=[-w1/2, w1/2, w2/2, w1/2, -w1/2, -w2/2];
    ys=[0, 0, 0, 0, 0, 0];
    zs=[b1, b1, 0, -b2, -b2, 0];

    fill3(xs, ys, zs, 'b')
    grid on
    axis square 
end

мы получили:

введите здесь описание изображения

person Andrzej Pronobis    schedule 27.06.2015
comment
Это снова отличный ответ! Так просто, но элегантно. Именно то, что нам нужно здесь. Я думаю, что у вашего решения даже меньше параметров, чем у Берта, потому что у вас нет угла напрямую, но он может быть выведен вторично из ваших параметров. - person Léo Léopold Hertz 준영; 27.06.2015
comment
Сначала я не заметил, что d1 и d2 — это длины сторон. Я исправил это в приведенном выше коде, поэтому параметризация основана на ширине и длине сторон. - person Andrzej Pronobis; 27.06.2015
comment
Хорошая реализация! Это предполагает, что верхняя и нижняя стороны параллельны, а шестиугольник имеет вертикальную ось симметрии. - person Bert; 27.06.2015
comment
Предполагая, что вам не нужны другие степени свободы, вы можете переставить их следующим образом. Заменяя w1 и d1 их отношением r1 (и равным образом r2) и добавляя rw как w1/r2, вы полностью определяете форму и можете установить размер в независимом параметре. - person Bert; 27.06.2015
comment
Ниже я добавил вики-страницу о том, как, наконец, создать сетку с помощью синтаксиса. - person Léo Léopold Hertz 준영; 29.06.2015

Пытаясь установить стандартную библиотеку сеток, я считаю, что мы должны начать с определения степеней свободы.

Для вогнутых бисимметричных шестиугольников с двумя горловинами это может быть:

  1. ширина оси рта (W_m)
  2. относительная ширина верха (w_t = W_t / W_m)
  3. относительная ширина дна (w_b = W_b / W_m)
  4. относительная верхняя высота
  5. относительная высота дна

Ответы Маргуса и А_А будут полезны для реализации.

person Bert    schedule 26.06.2015
comment
На самом деле, я думаю, что ваш ответ лучше отвечает на вопрос, чем Маргус и А_А. Суть в том, чтобы понять, что стандартизировать для стандартной сетки. Отличные идеи! - person Léo Léopold Hertz 준영; 27.06.2015

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

Создать сетку по собственному алгоритму

  1. разделите шестиугольник на две трапеции пунктирной линией, как показано в тексте вопроса
  2. разделить трапеции на треугольники: assemmbly и построить тримешные структуры по inittri
  3. вектор нагрузки f создается bilin_assembly (потому что это работало раньше, но не обязательно было оптимальным выбором)

Разделение шестиугольника с двумя горловинами на две трапеции

  1. возьмем два узла, разница индексов которых равна трем, а расстояние между ними наименьшее среди шести узлов.
  2. сформируйте две трапеции так, чтобы одна трапеция имела номера 1-4, а другая 1,6,5,4.

Следующие синтаксисы основаны на моих редакциях кодов 2013 года, но в основном на описаниях книги Класа Джонсона Численные решения уравнений в частных производных методом конечных элементов.

Синтаксис сборки, который сейчас для простоты считается проблемой Пуассона (здесь необходимо уточнить позже)

% [S,f]=assemblyGlobal(loadfunction,mesh)
%
%   loadfunction = function on the right-hand side of the Poisson equation
%   mesh         = mesh structure on which the assembly is done
%
%   S            = stiffness matrix of the Poisson problem
%   f            = load vector corresponding to loadfunction

где нам нужна билинейная сборка какой синтаксис

% function B=bilin_assembly(bilin,mesh)
%
%  bilin = function handle to integrand of the bilinear form
%          given as bilin(u,v,ux,uy,vx,vy,x,y), where
%          u  - values of function u
%          v  - values of function v
%          ux - x-derivative of function u
%          uy - y-derivative of function u
%          vx - x-derivative of function v
%          vy - y-derivative of function v
%          x  - global x-coordinate
%          y  - global y-coordinate
%  mesh  = mesh structure on which the matrix will be assembled
%
%  B     = matrix related to bilinear form bilin

Синтаксис для инициализации треугольной сетки

% function mesh = inittri(p,t)
%
%   p       = nodes
%   t       = triangles
%     
%   mesh    = trimesh structure corresponding to (p,t)
%
% TRIMESH STRUCTURE :
% 
%   p       = nodes in a 2xN-matrix
%
%   t       = triangles in a 3xN- matrix (nodes of the triangles as indeces to the p- matrix).
% 
%   edges   = a matrix of all edges in the mesh. Each column is an edge :
%             [n1 ; n2] where n1 < n2;
%
%   t2e     = a matrix connecting  triangle's and edges's. 
%             Each column corresponds to a triangle and has
%             triangle's edges in the order n1->n2, n2->n3,
%             n1->n3. 
%
%   e2t     = inverse of t2e.

Я не публиковал здесь полные исходные коды из-за проблем с авторскими правами, и они сделали бы ответ довольно длинным. Тем не менее, все алгоритмы основаны на первом источнике, поэтому могут быть созданы здесь любым исследователем. Я думаю, что такой метод FEM — единственный способ найти здесь оптимальную сетку.

Алгоритмы для общих невыпуклых многоугольников

Существуют также алгоритмы, которые могут создавать сетки для общих невыпуклых многоугольников. Вполне возможно, что сетка, предоставленная ответом Маргуса, создается таким алгоритмом.

Ансис

У меня были разные продукты для визуализации отверстий, разных геометрий и разных материалов. Ansys является многообещающим решением.

Источники

  1. Численное решение уравнений в частных производных методом конечных элементов Класа Джонсона.
  2. Заметки о занятиях по методам конечных элементов в моем университете, 2013-2014 гг.
person Community    schedule 29.06.2015
comment
Мне пришлось принять это здесь, потому что это единственный ответ, который предлагает систематический способ найти стандартную сетку. Я более чем счастлив ответить на любой лучший ответ, который может предоставить бесплатные исходные коды для систематического тестирования. - person Léo Léopold Hertz 준영; 27.07.2015