Построение изоповерхностей (их линейной аппроксимации ) и вопросы визуализации.

Пусть в трехмерном пространстве задана функция   f(x,y,z) .  Ставится  задача линейной аппроксимации  изоповерхности f(x,y,z) =С. Разделим пространство определения  этой функции на достаточно большое количество кубов, такое чтобы  изменение функции в пределах ребра куба приближалось к линейному закону. Определим  значение функции в  вершинах каждого куба.   Все кубы   можно  классифицировать  на те, для которых во всех вершинах функция принимает  значение меньшее С ( куб лежит под изоповерхностью ), на те, для которых во всех вершинах функция принимает  значение большее  С  ( куб лежит  над изоповерхностью ),  и  на те, для которых в  пределах одного куба в одной части  вершин функция принимает  значение меньшее С   а   в другой части вершин функция принимает  значение большее  С  (  изоповерхность пересекает куб ).  Для  определенности пронумеруем вершины куба.  На  фиг 1  представлена  одна из возможных схем нумерации нумерация  вершин на  кубе.  Для построения аппроксимации изоповерхности  из  256 возможных ситуаций  сравнения значений функции в 8 вершинах куба с константой  С представляют интерес только 254  (два случая непересечения  куба отбрасываются  )  Анализ 254 показывает [ W. E. Lorensen,  H.E. Cline ], учитывая два вида  симметрии  можно  число существенно  различных ситуаций  понизить  до  14. Первое, с точки  зрения аппроксимации  изоповерхности  отношения  значений  функции в вершинах куба и константы С ( больше  или  меньше ) реверсивны. 

 

Очевидно,  функция будет  значения  равные  C  на ребрах, связывающих вершины  с  разными  знаками  выражения  f(x,y,z) - C .  Используя  формулы линейной   интерполяции, можно определить координаты точек  на ребрах, где функция  равна  С. 

 

 Для каждого куба, который  пересекает изоповерхность( такие кубы называют пограничными -Marching Cubes), путем линейной интерполяции определим  точки на ребрах , где функция принимает  значение С,  и  затем  соединим  эти точки  прямыми линиями , то получим треугольник или систему треугольников , аппроксимирующую  эквипотенциальную поверхность f(x,y,z) = C, пересекающую данный куб.  Объединенная система треугольников всех кубов будет линейной аппроксимацией изоповерхности. Эта идея лежит в основе алгоритма "Marching Cubes: A High Resolution 3D Surface Construction Algorithm", William E. Lorensen and Harvey E. Cline. Computer Graphics, Vol. 21, No. 4, pp 163-169 (Proc. of SIGGRAPH), 1987.

Здесь мы приводим ряд материалов[ 1,2,3,4,5,6 ] посвященных этому вопросу. Кроме того,  публикуем наш вариант реализации алгоритма пограничных кубов.

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

содержания оператора mesh  в файле входных данных  input.pov  общедоступного программного комплекса  POV-RAY для визуализации трехмерных объектов.

Ниже приведен фрагмент файла  input.pov :

==================================

#include "colors.inc"http://www.povray.org/
#include "golds.inc"
#include "woods.inc"
#include "glass.inc"
#include "metals.inc"
#include "stones.inc"
//#include "camera-context.inc"
 //common file containing object definitions for the camera demos
 
// begin new data
// 0.60 0.40 1.4                                     R,r,h(f5.2)
// 0.5  0.0  0.00 0.07                               (x1,y1,z1,r1)
// 0.5  0.04 0.00 0.06                               (x2,y2,z2,r2)
// 0.46 0.04 0.00 0.07                               (x3,y3,z3,r3)
// 0.5  0.00 0.05 0.06                               (x4,y4,z4,r4)
// 0.5  0.02 0.30 0.06                               (x5,y5,z5,r5)
// end new data
//          T_Wood19
// texture {T_Gold_3C}
// texture {T_Glass2} 
//camera {
//
//  location < -1. ,-1.,   -1. >
//
//  look_at <1 ,1.0,1.0>
//
//  angle 60
//  }
       
  camera {
        orthographic
        location<-5.0,-5.0,   -5.0 >
        look_at <1.0, 1.0,  1.0>
        angle 35
        }
     
       
background { color rgb<1.2, 1.0, 1.0>  } //


// A white marble floor

      plane { y, 5.
   pigment {
      checker color Yellow color Green
      scale 4
   }
   finish {
      ambient 0.2
      diffuse 0.8
   }
}
     light_source { < -1. ,-1.,  -1. > color White }
     mesh   {
    triangle { < -0.01, -0.51, -0.25>,< -0.01, -0.51, -0.25>,< -0.01, -0.52, -0.25> }      
    triangle { <  0.00, -0.52, -0.25>,<  0.00, -0.51, -0.25>,< -0.01, -0.51, -0.25> }      
    triangle { < -0.01, -0.51, -0.25>,< -0.01, -0.52, -0.25>,<  0.00, -0.52, -0.25> }

    .............................................................................................................................

    triangle { < -0.49,  0.00,  0.19>,< -0.50,  0.01,  0.19>,< -0.50,  0.00,  0.19> }      
 texture {T_Glass2} 
            }

======================================

 

                             

 Список triangle { <.......> }  -  это выход программы  генерации изоповерхности. Программный комплекс  POV-RAY обладает уникальными возможностями  визуализации трехмерных объектов. Например , есть возможность увидеть вложенные объекты. Для этого достаточно указать, что внешний объект выполнен из прозрачного материала, скажем, стекла( смотрите "texture {T_Glass2}" в фрагменте файла .pov ). Подробности о модельной задаче читайте в файле "Программа построения изоповерхностей по методу пограничных кубов (RSbyC)"