равномерная выборка 3D-модели - PullRequest
2 голосов
/ 16 марта 2011

Я ищу метод / алгоритм для равномерной выборки поверхности трехмерных моделей в C ++.Я нашел методы для равномерной выборки единичной сферы, такие как this и this , но мне нужно что-то, что будет работать и для более сложных трехмерных моделей, которые также могут быть вогнутыми.заранее спасибо

1 Ответ

2 голосов
/ 16 марта 2011

Что я делаю: моя модель состоит из множества различных примитивов (треугольники, четырехугольники, диски, цилиндр ...).Для каждого примитива я могу реализовать метод случайного выбора (например, http://mathworld.wolfram.com/TrianglePointPicking.html). Каждый примитив может вычислить свою площадь поверхности. Чем выше площадь примитива, тем выше его вероятность генерировать случайную точку. В моей модели я строю накопительнуюсписок вроде этого

class Model{
  // ...
  vector<pair<double, Primitive*> > primitives_;
}

void Model::AddPrimitive(Primitive* p)
{
  double area = p->Area();
  if (!primitves_.empty())
    area += primitives_.back().first;
  primitives_.push_back(make_pair(area, p));
}

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

Point Model::RandomPoint()
{
  double maxArea = primitives_.back().first;
  double rnd = maxArea * Uniform01();  // random in [0; maxArea] 
  Iterator it = std::lower_bound(
        primitives_.begin(), primitives_.end(), rnd, FirstLess()); 
  return it->second->RandomPoint();    
}
...