моделирование трехмерных ячеек, определяемых пересечениями поверхностей - PullRequest
2 голосов
/ 23 ноября 2010

Я пытаюсь создать интерактивное трехмерное представление ячеек, которые определяются пересечением произвольных поверхностей.Мне трудно понять, как создать сетку из этого (или есть что-то лучше, чем сетка, к которой я должен стремиться представлять трехмерные объемы?).Каждая поверхность s задается аналитическим выражением для плоскости, сферы, цилиндра, конуса и т. Д. Как s = f (x, y, z) = 0, например здесь:

enter image description here

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

Я могу проверить тысячи точек сетки, отмечая для каждой ячейки те точки, которые лежат внутри этой ячейки, а затем используя самый внешний изэти точки, чтобы создать сетку для этой ячейки.Тем не менее, у меня есть тысячи клеток, и это просто не будет достаточно быстро.Многие ячейки имеют очень малое или низкое соотношение сторон по сравнению с другими, поэтому мне понадобится очень точная сетка точек, если я собираюсь сделать это таким образом.таким образом в статическую 3d модель?Есть ли какая-нибудь библиотека, которая работает с такой спецификацией геометрии, которая может создавать для меня 3d-сетки?Я что-то упускаю из виду?

Спасибо, Ник

1 Ответ

1 голос
/ 25 ноября 2010

Как общая проблема, это довольно сложно: я думаю, что это в основном общая проблема нелинейного программирования.Если ваши границы генерируются произвольными функциями, может быть произвольное количество ячеек, ограниченных хотя бы одной такой функцией;без дополнительной информации о функциях я не думаю, что вы справитесь лучше, чем проверка точек сетки.

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

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


Другая идея: поскольку вы определяете свои поверхности с помощьюf(x,y,z)=0, вы можете начать с набора точек и численно перенести их на соседние поверхности с помощью шага метода Ньютона или чего-то подобного:

point p = (x,y,z)
scalar value = f(p)
while abs(value) > epsilon:
  vector gradient = gradient_of_f(p)
  p -= gradient * (value / dot(gradient,gradient))
  value = f(p)

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

...