Общая формула для вычисления объема многогранника

  1. Использование ldd для списка совместно использованных библиотек для каждого исполняемого файла.
  2. Очистка вывод
  3. Вид, вычислите количества, вид количеством

Для нахождения ответа для всех исполняемых файлов в "/мусорное ведро" каталог:

find /bin -type f -perm /a+x -exec ldd {} \; \
| grep so \
| sed -e '/^[^\t]/ d' \
| sed -e 's/\t//' \
| sed -e 's/.*=..//' \
| sed -e 's/ (0.*)//' \
| sort \
| uniq -c \
| sort -n

Изменение "/мусорное ведро" выше к "/" для поиска всех каталогов.

Вывод (для просто / каталога bin) будет выглядеть примерно так:

  1 /lib64/libexpat.so.0
  1 /lib64/libgcc_s.so.1
  1 /lib64/libnsl.so.1
  1 /lib64/libpcre.so.0
  1 /lib64/libproc-3.2.7.so
  1 /usr/lib64/libbeecrypt.so.6
  1 /usr/lib64/libbz2.so.1
  1 /usr/lib64/libelf.so.1
  1 /usr/lib64/libpopt.so.0
  1 /usr/lib64/librpm-4.4.so
  1 /usr/lib64/librpmdb-4.4.so
  1 /usr/lib64/librpmio-4.4.so
  1 /usr/lib64/libsqlite3.so.0
  1 /usr/lib64/libstdc++.so.6
  1 /usr/lib64/libz.so.1
  2 /lib64/libasound.so.2
  2 /lib64/libblkid.so.1
  2 /lib64/libdevmapper.so.1.02
  2 /lib64/libpam_misc.so.0
  2 /lib64/libpam.so.0
  2 /lib64/libuuid.so.1
  3 /lib64/libaudit.so.0
  3 /lib64/libcrypt.so.1
  3 /lib64/libdbus-1.so.3
  4 /lib64/libresolv.so.2
  4 /lib64/libtermcap.so.2
  5 /lib64/libacl.so.1
  5 /lib64/libattr.so.1
  5 /lib64/libcap.so.1
  6 /lib64/librt.so.1
  7 /lib64/libm.so.6
  9 /lib64/libpthread.so.0
 13 /lib64/libselinux.so.1
 13 /lib64/libsepol.so.1
 22 /lib64/libdl.so.2
 83 /lib64/ld-linux-x86-64.so.2
 83 /lib64/libc.so.6

Редактирование - Удаленный "grep-P"

5
задан Graviton 3 December 2009 в 08:12
поделиться

4 ответа

  1. Возьмите многоугольники и разбейте их на треугольники.
  2. Рассмотрим тетраэдр, образованный каждым треугольником и произвольной точкой (начало координат).
  3. Суммируйте объемы этих тетраэдров со знаком.
  4. 1255] Примечания:

    1. Это будет работать только в том случае, если вы можете сохранить последовательный порядок CW или CCW для треугольников, если смотреть снаружи.
    2. Знаковый объем тетраэдра равен 1/6 определителя следующего матрица:

    [x1 x2 x3 x4]
    [y1 y2 y3 y4]
    [z1 z2 z3 z4]
    [1 1 1 1]

    , где столбцы представляют собой однородные координаты вершин (x, y, z, 1).

    Это работает, даже если форма не охватывает начало координат, также вычитая этот объем как добавление, но это зависит от наличия последовательного порядка.

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

    Изменить: Я хотел бы добавить, что для треугольной сетки, где одна вершина (скажем, V4) тетраэдра равна (0,0,0), детерминант матрицы 4x4 может быть упрощен до верхнего левого угла 3x3 (расширение по 0,0, 0,1 столбца), и это можно упростить до Vol = V1xV2.V3, где «x» - это перекрестное произведение, а «.» это точечный продукт. Итак, вычислите это выражение для каждого треугольника, сложите эти объемы и разделите на 6.

9
ответ дан 18 December 2019 в 14:47
поделиться

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

(Я считаю, что есть математический способ / формула, например, использование векторов и матриц.
Предлагаю также разместить ваш вопрос на http://mathoverflow.net )

2
ответ дан 18 December 2019 в 14:47
поделиться

Я делал это раньше, но сетка поверхности, которую я использовал, всегда имела треугольные грани. Если ваша сетка имеет нетреугольные грани, вы можете легко сначала разбить их на треугольные грани. Затем я скормил его TetGen , чтобы получить тетраэдризацию внутренней части. Наконец, я сложил все объемы тетраэдров. TetGen достаточно прост в использовании, и это единственная библиотека, отличная от CGAL , которую я знаю, которая может обрабатывать сложные сетки. CGAL довольно прост в использовании, если вы не против установить гигантскую библиотеку и использовать шаблоны как сумасшедшие.

1
ответ дан 18 December 2019 в 14:47
поделиться

Сначала разбейте каждую грань на треугольники, нарисовав новые ребра.

Теперь посмотрите на один треугольник и предположите, что он находится на «верхней» поверхности (некоторые из этих деталей окажутся будет неважным позже). Посмотрите на объем под треугольником, до некоторой горизонтальной плоскости под многогранником. Если {h1, h2, h3} - это высоты трех точек, а A - площадь основания, то объем твердого тела будет A (h1 + h2 + h3) / 3. Теперь нам нужно сложить объемы этих тел для верхних граней и вычесть их для нижних граней, чтобы получить объем многогранника.

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

Итак, что нам нужно, это (1) способ вычисления площади основания и (2) способ отличить «верхнюю» грань от «нижней». Первый прост, если у вас есть декартовы координаты точек, второй - простой, если точки упорядочены, и вы можете объединить их и убить двух зайцев одним выстрелом. Предположим, что для каждой грани у вас есть список ее углов в порядке против часовой стрелки. Тогда проекция этих точек на плоскость xy будет против часовой стрелки для верхней грани и по часовой стрелке для нижней. Если вы используете этот метод для вычисления площади основания, он будет иметь положительное значение для верхней грани и отрицательное для нижней, так что вы можете сложить их все вместе и получить ответ.

Так как же получить упорядоченные списки углов? Начнем с одного треугольника, выберите порядок, и для каждого ребра сосед, который разделяет это ребро, должен перечислить эти две точки в противоположном порядке. Переходите от соседа к соседу, пока не получите список для каждого треугольника. Если объем многогранника отрицательный, просто умножьте его на -1 (это означает, что вы выбрали неправильный порядок для этого первого треугольника, и многогранник был вывернут наизнанку).

РЕДАКТИРОВАТЬ: Я забыл самое лучшее! Если вы проверите алгебру для сложения этих объемов, вы увидите, что многие термины сокращаются, особенно при объединении треугольников обратно в исходные грани. Я не проработал это подробно, но похоже, что конечный результат может быть на удивление простой функцией.

1
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

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