Как общая проблема, это довольно сложно: я думаю, что это в основном общая проблема нелинейного программирования.Если ваши границы генерируются произвольными функциями, может быть произвольное количество ячеек, ограниченных хотя бы одной такой функцией;без дополнительной информации о функциях я не думаю, что вы справитесь лучше, чем проверка точек сетки.
Если вы знаете что-то о своей функции (например, плоскость, сфера, цилиндр и конус - все коники),Вы можете быть в состоянии сделать лучше.В любом случае вы можете начать с комбинаторного подхода;скажем, учитывая любые 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)
Нечто подобное должно позволить вам приблизиться к краям и угловым точкам.Может быть, сложнее понять, как соединить такие точки в сетку, хотя ...