Хождение вопроса о кубе

Получил работу с кодом ниже.

Спасибо Дж. Г. за помощь, ваш вклад заставил его работать!

function generateFolderIndex(id) {
   var folder = DriveApp.getFolderById('[ID]');
   var subFolders = folder.getFolders();
   var childFolders = subFolders
   var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Projekt');

   sheet.clear();
   sheet.appendRow(["Projekt", "Länk", "Skapad"]);

while (subFolders.hasNext())
  {    
  var childFolder = childFolders.next(); 

  var folderID = childFolder.getId();
  var name = childFolder.getName()
  var link = childFolder.getUrl()
  var date = childFolder.getDateCreated()


   data = [name, link, date, ]
    sheet.appendRow(data);

  }
};
6
задан noob88 22 April 2009 в 11:05
поделиться

1 ответ

Эти таблицы используются для того, чтобы узнать, как выполнить тесселяцию поверхности:

Первая таблица дает необходимые ребра для интерполяции. Вторая таблица дает вам способ тесселяции, то есть какие треугольники вы должны сделать внутри куба.

Небольшой пример:

давайте предположим, что вершины один и 2 находятся ниже уровня iso, кубический индекс должен быть 3.

Все пересечение должно выглядеть клин.

Если вы думаете об этом, вы должны интерполировать значения по краям: 0 и 9, а также 2 и 10. Если вы введете это в битовое поле, каждый бит, соответствующий «пересекается ли ребро?» вы бы в итоге получили что-то вроде этого:

10 9 8 7 6 5 4 3 2 1  edge
 1 1 0 0 0 0 1 0 1 0  intersected?

не так ли?

Какое именно значение из edgeTable [3] в двоичном виде;) 0x30A = 1100001010

Теперь вы можете написать функцию, которая линейно интерполирует точки на этих ребрах чтобы соответствовать вашему уровню. Эти точки станут вашей поверхностью внутри этой ячейки.

Но как провести тесселяцию этой ячейки / поверхности?

если вы посмотрите на triTable [3], улыбка должна ползти по вашему лицу:)

Addit после утверждения остатка недоумение в комментарии:; -)

Что делают Marching Cubes: Представьте, что у вас есть темная комната с одним точечным источником света. Это центр объемного поля интенсивности света скалярных значений интенсивности. Вы можете перейти к точке (x, y, z) и измерить там интенсивность, например, 3 канделы.

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

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

Итак: Первые марширующие кубы разбивают весь объем на кубы одинакового размера. Если базовые данные имеют некоторую базовую дискретность, используются их кратные. Я не буду вдаваться в другой случай, так как это редко. Например, мы помещаем сетку с плотностью 1 мм в комнату 2xx5mx5m

. Мы используем кубики 5mmx5mmx5mm. Пробежка по ним должна быть намного дешевле.

Теперь вы можете представить, что ребра некоторых кубов пересекают изоповерхность. Это интересные. Этот код идентифицирует их:

cubeindex = 0;
   if (grid.val[0] 

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

Пожалуйста, представьте это в своем уме. Видеть http://en.wikipedia.org/wiki/Marching_cubes для примеров пересекающихся кубов.

Вершины, которые вы могли бы легко получить, это те, которые находятся на краях куба. Просто линейно интерполируйте между двумя угловыми точками, чтобы найти положение из isoveue и положить там вершину. Но какие края пересекаются ??? Это информация в edgeTable [cubeindex]. Это большой кусок кода со всеми if, который хранит интерполированное точки как вершины в массиве точек xyz: vertlist []. Эта часть выглядит следующим образом:

get the bitfield = edgeTable[cubeindex]
 if edge 1 is marked in bitfield (bit 1 set to 1 in bitfield)
    vertlist[0] = interpolated point, somewhere on edge 1
... and so on.

Теперь у вас есть массив, полный вершин, но как соединить их с треугольниками? Это информация, которую предоставляет tritable.

Остальное - в значительной степени то, что я объяснил выше.

Что ж, если проблемы все еще будут, пожалуйста, будьте внимательны с фрагментом кода, который доставляет вам проблемы.

12
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: