Один из способов сделать это - начать с платонового твердого тела с треугольными сторонами - например, октаэдра . Затем возьмите каждый треугольник и рекурсивно разбейте его на более мелкие треугольники, например:
Как только у вас будет достаточное количество точек, вы нормализуете их векторы, чтобы все они находились на постоянном расстоянии от центра твердого тела. Это приводит к тому, что стороны выступают в форму, напоминающую сферу, с увеличением гладкости по мере увеличения количества точек.
Нормализация здесь означает перемещение точки так, чтобы ее угол по отношению к другой точке был таким же, но расстояние между ними другое. Вот двухмерный пример.
A и B находятся на расстоянии 6 единиц. Но предположим, что мы хотим найти точку на линии AB, удаленную на 12 единиц от A.
Мы можем сказать, что C - это нормализованная форма B относительно A с расстоянием 12. Мы можем получить C с помощью такого кода:
#returns a point collinear to A and B, a given distance away from A.
function normalize(a, b, length):
#get the distance between a and b along the x and y axes
dx = b.x - a.x
dy = b.y - a.y
#right now, sqrt(dx^2 + dy^2) = distance(a,b).
#we want to modify them so that sqrt(dx^2 + dy^2) = the given length.
dx = dx * length / distance(a,b)
dy = dy * length / distance(a,b)
point c = new point
c.x = a.x + dx
c.y = a.y + dy
return c
Если мы сделаем этот процесс нормализации для множества точек, все относительно одной и той же точки A и с одинаковым расстоянием R, тогда все нормализованные точки будут лежать на дуге окружности с центром A и радиусом R.
Здесь черные точки начинаются на линии и «выпирают» в дугу.
Этот процесс можно расширить до трех измерений, и в этом случае вы получите сферу, а не круг. Просто добавьте компонент dz к функции нормализации.
Если вы посмотрите на сферу в Epcot , вы увидите, как работает эта техника. это додекаэдр с выпуклыми гранями, чтобы он выглядел более округлым.