Визуализация поверхностей уровня
-
10-10-2019 - |
Вопрос
Я пытаюсь разработать визуализатор поверхности уровня, используя этот метод (не знаю, является ли это стандартным методом или есть что -то лучше):
- 1. Возьмите любую функцию
f(x,y,z)=k
(где k постоян), и границы для x, y и z. Также возьмите два параметра сетки Stepx и Stepz.- 2. Чтобы уменьшить проблему кривой уровня, итерация от Zmin до Zmax с интервалами Stepz. Так
f(x,y,z)=k => f(x,y,fixedZ)=k
- 3. Сделайте ту же процедуру с Stepx, уменьшив проблему до
f(fixedX, y, fixedZ)=k
- 4. Решите
f(fixedX, y, fixedZ) - k = 0
Для всех значений Y, которые удовлетворят это уравнение (используя какой -то алгоритм поиска корней).- 5. Для всех сгенерированных точек постройте те, которые в качестве кривой уровня (внутренний цикл генерирует кривые уровня при заданном Z, затем для разных значений Z есть только стеки кривых уровней)
- 6 (необязательно). Создайте сетку из этих кривых/точек уровня, которые принадлежат набору уровня.
Проблема, с которой я сталкиваюсь с шагом 4. У меня нет возможности узнать, сколько возможных значений Y удовлетворит это уравнение (более конкретно, сколько уникальных и реальных значений Y).
Кроме того, я стараюсь сохранить программу как можно более общей, поэтому я пытаюсь не ограничивать исходную функцию f(x,y,z)=k
к любым ограничениям, таким как гладкость или полиномиальность, кроме K, должны быть постоянными, как это требуется для поверхности уровня.
Есть ли алгоритм (без использования CAS/символического решения), который может идентифицировать корень (ы) функции, даже если у него есть несколько корней? Я знаю, что методам понесения трудно с этим трудно из -за возможности изменений признаков по региону, но как проходит метод Secant/Newtons? На каком наборе функций можно использовать метод Secant/Newtonons, и может ли он обнаружить и найти все уникальные реальные корни в двух заданных границах? Или есть лучший метод для генерации/визуализации поверхностей уровня?
Решение
Я думаю, что нашел решение моей проблемы. Я провел немного больше исследований и обнаружил, что поверхность уровня является синонимом Isoverface. Так что теоретически что -то вроде метода марширующих кубиков должно работать.
Другие советы
Если вам нужен пример алгоритма марширующих кубиков, проверьте
http://stemkoski.github.com/three.js/marching-cubes.html
(использует javaScript/thry.js для графики).
Для получения более подробной информации о теории, вы должны проверить статью на
Простой способ,
2d: график (x, y) с цветом = пол (q*f (x, y)) в сероме, где q - какой -то произвольный фактор. 3d: сюжет (x, y, пол (q*f (x, y))
Эффективно высота функции, которая эквивалентна, будут представлять на той же поверхности уровня.
Если вы получите кривые уровня, вы можете использовать 2D -метод и категоризацию обнаружения/региона, чтобы получить точки (x, y) на том же уровне.