Количество точек в УФ сфере

Я пытаюсь создать сетку из сферы радиуса r. Моя цель - создать UV-сферу так, чтобы каждая точка многогранника находилась на расстоянии от сферы меньше tol.

Следующий код создает сетку точек на сфере. Как я могу вычислить parallels_count и meridians_count, чтобы все точки сетки находились в пределах допуска?

  for j in parallels_count:
     parallel = PI * (j+1) / parallels_count
  for i in meridians_count:
     meridian = 2.0 * PI * i / meridians_count
  return spherical_to_cartesian(meridian, parallel)

Код взят из здесь, а это изображение УФ-сферы:

это

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

введите описание изображения здесь


person sgiulia    schedule 15.11.2016    source источник
comment
Здравствуйте, почему бы вам не использовать параметрическое уравнение сферы, которая равна x = r*cos(u)*cos(v) с -PI <= u <= PI ; -PI/2 <= v <= PI/2, y = r*sin(u)*cos(v) и z=r*cos(v)?   -  person Franck Ngako    schedule 15.11.2016
comment
Привет, я думаю, это то, что делает метод spherical_to_cartesian(). parallel и meridian похожи на ваши u и v.   -  person sgiulia    schedule 15.11.2016


Ответы (1)


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

dangle = tol/r; //[rad]

где r - радиус сферы в тех же единицах, что и tol, вы можете использовать меньший шаг, чтобы быть уверенным, как dangle*=0.75;, используйте его как для parallel, так и для meridian углов.

Если вы хотите вместо этого свои подсчеты, попробуйте:

meridians_count = (2.0*PI*r/tol)+1; // ceil or +1 just to be sure
parallels_count = 0.5*meridians_count;

Пока еще рано, поэтому я надеюсь, что не сделал глупых математических ошибок (самый простой способ - худший для глупых ошибок).

Также взгляните на несколько моих вопросов по контролю качества:

[Edit1] хорошо, ваше новое определение tol меняет все

Я это вижу так:

tol

sin(da/2) = (r-tol)/r
da = 2.0*asin((r-tol)/r)

Если вы конвертируете в сферическую поверхность, максимальная разница находится в центре ячейки сетки uv, которая представляет sqrt(2)*dadiagonal, поэтому попробуйте использовать:

da = sqrt(2.0)*asin((r-tol)/r)

так что ваш угловой шаг должен быть немного меньше этого ...

person Spektre    schedule 16.11.2016
comment
Спасибо @Spektre, но разделив длину экватора на tol, вы получите meridians_count дуг длиной, равной tol. Я не могу найти 3D-изображение, но ссылаюсь на это 2D-изображение , вы получаете длину дуги tol, в то время как я ищу трехмерный эквивалент подъема длиной ‹tol. - person sgiulia; 16.11.2016
comment
Привет, @Spektre, еще раз спасибо! Я изменил вопрос, надеясь, что он проясняет определение tol. При применении двухмерного подхода к направлениям U и V сетка может выходить за пределы допуска в центре некоторых четырехугольных граней. - person sgiulia; 17.11.2016
comment
@sgiulia Я имею в виду использование сферы da <= sqrt(2.0)*asin((r-tol)/r) - person Spektre; 18.11.2016