Поиск минимальной граничной сферы для усечения

У меня есть усечка (усеченная пирамида), и мне нужно вычислить ограничительную сферу для этого усечения, насколько это возможно. Я могу выбрать центр справа в центре усеченного конуса, а радиус - расстояние до одного из "дальних" углов, но обычно это оставляет довольно много слабины вокруг узкого конца усечения

Это похоже на простую геометрию, но я не могу понять ее. Любые идеи?

Ответ 1

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

Ответ 2

Хорошо, http://www.cgafaq.info/wiki/Minimal_enclosing_sphere, конечно (через Google).

Я думаю, что есть две возможности. Один (если усечка очень плоская) будет заключаться в том, что противоположные точки основания становятся противоположными точками на сфере. Другой (если уклонение очень высокое) было бы тем, что противоположные точки усечения были бы на сфере, и вы бы определили сферу из этих четырех точек (одна точка на базе, одна напротив первой на базе, один напротив первого на более высоком квадрате, один рядом с первым на более высоком квадрате).

Выясните первую сферу. Если усечка укладывается в нее, это ваш ответ. В противном случае вторая сфера будет вашим ответом.

Ответ 3

Для этой проблемы существует несколько алгоритмов и реализаций (см. также этот пост).

  • Для 2D и 3D, реализация Gärtner, вероятно, самая быстрая.

  • Для более высоких измерений (например, до 10 000) взгляните на https://github.com/hbf/miniball, что является реализацией алгоритм Гертнера, Кутца и Фишера (примечание: я один из соавторов).

  • Для очень, очень больших размеров алгоритмы ядра (аппроксимации) будут быстрее.

В вашем конкретном приложении вы можете попробовать любой из первых двух алгоритмов. Оба работают в O(n) с очень небольшой константой и численно стабильны.

Ответ 4

Способ сделать это - найти сферу, которая соответствует 4 точкам на вашем усечении. Если это правильная усечка (усеченная пирамида - моя неудача, я принимал цилиндрический fristum), тогда вы получаете две точки из противоположных углов верхнего квада, а две другие из нижнего квадроцикла, не в фазе с двумя верхними, Затем используйте this, чтобы получить свою сферу.

Ответ 5

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

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

Ответ 6

Вам нужно найти точку на "вертикальной" линии вниз по центру усеченного конуса, где расстояние до края на дне и вершине усеченного конуса (при условии, что оно симметрично) одинаково.

решаем так, что точка на дне Xb, Yb, Zb, точка сверху - это Xt, Yt, Zt, а прямая - точка Xp, Yp, Zp плюс вектор Ax, By, Cz.

так решим уравнение

sqrt( (Xb - (Xp + VAx) )^2 + (Yb - (Yp + VBy))^2 + (Zb - (Zp + VCy))^2) = 
sqrt( (Xt - (Xp + VAx) )^2 + (Yt - (Yp + VBy))^2 + (Zt - (Zp + VCy))^2).

Единственная переменная в ней есть скаляр V.

Ответ 7

Строго говоря (согласно this), базой усеченного конуса может быть любой многоугольник, а также, строго говоря, что многоугольник не даже должны быть выпуклыми. Тем не менее, чтобы получить общее решение проблемы, я думаю, вам может понадобиться (почти) все вершины, как было предложено выше. Однако могут быть особые случаи, решение которых (как было предложено выше) может потребовать только сравнения нескольких сфер. Мне нравится ссылка Энтони выше: Megiddo обеспечивает преобразование, которое он утверждает, дает решение в O (n) (!) Времени. Неплохо!

Ответ 8

Хорошо разрешите с помощью математики.

Используя правую систему координат Y вверх (вперед -Z-ось), для усеченного конуса с шириной видового экрана w, высотой h, вблизи плоскости n, дальняя плоскость f, поле зрения оси X поля fov, то минимальная ограничивающая сфера равна

k = sqrt(1+(h/w)^2) * tan⁡(fov/2)

if( k^2 >= (f-n)/(f+n) )
{
    C = (0, 0, -f)
    R = f*k
}
else
{
    C = (0, 0, -0.5 * (f+n) * (1+k^2))
    R = 0.5 * sqrt( (f-n)^2 + 2*(f^2+n^2)*k^2 + (f+n)^2*k^4 )
}

C - центр сферы, в пространстве вида, R - радиус.

Я размещаю детали в своем блоге, если вам интересно: https://lxjk.github.io/2017/04/15/Calculate-Minimal-Bounding-Sphere-of-Frustum.html