Параметризация трехмерной геометрии для оптимизации формы - PullRequest
3 голосов
/ 08 декабря 2011

Я пытаюсь параметризовать трехмерную геометрию для оптимизации формы. Структура выглядит следующим образом. Другой реальный пример - здесь .

enter image description here

В настоящее время я использую BSplines, чтобы создать нижнюю часть, и использую симметрию, чтобы создать всю нижнюю часть фольги. Вот что я получаю. enter image description here enter image description here

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

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

BR

1 Ответ

2 голосов
/ 08 декабря 2011

Я думаю, у вас есть два варианта: 1) создать вторую часть геометрии, а затем написать алгоритм пересечения граней и граней, чтобы объединить их. 2) создайте вторую часть геометрии и напишите две функции, которые возвращают -1, если точка запроса находится внутри геометрии, и +1, если она находится снаружи (подойдут другие значения). Затем используйте RegionPlot3D[ f1[x,y,z]<0 || f2[x,y,z]<0,....]. Идея состоит в том, чтобы извлечь GraphicsComplex и использовать это. Вопрос будет в том, насколько хорошо вы можете приблизить углы с этим. Вот иллюстрация того, что я имею в виду.

if1[x_, y_, z_] := If[x^2 + y^2 + z^2 <= 1, -1, 1]
if2[x_, y_, z_] := If[(x - 1)^2 + y^2 <= 1 && -1.5 <= z <= 1.5, -1, 1]

res = RegionPlot3D[
  if1[x, y, z] < 0 || if2[x, y, z] < 0, {x, -2, 2}, {y, -2, 
   2}, {z, -2, 2}, PlotPoints -> 100, Boxed -> False, Axes -> False]

Затем извлеките координаты и многоугольники.

coords = res[[1, 1]];
poly = Cases[res[[1]], _Polygon, Infinity];
Graphics3D[GraphicsComplex[coords, poly], Boxed -> False]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...