Что я делаю: моя модель состоит из множества различных примитивов (треугольники, четырехугольники, диски, цилиндр ...).Для каждого примитива я могу реализовать метод случайного выбора (например, 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();
}