Один из способов сделать это - начать с платонового твердого тела с треугольными сторонами - например, октаэдр . Затем возьмите каждый треугольник и рекурсивно разбейте его на более мелкие треугольники, например:
Как только вы наберете достаточное количество точек, вы нормализуете их векторы так, чтобы все они находились на постоянном расстоянии от центра тела. Это приводит к тому, что стороны расширяются в форму, напоминающую сферу, с увеличением плавности при увеличении количества точек.
Под нормализацией здесь подразумевается перемещение точки таким образом, чтобы ее угол относительно другой точки был одинаковым, но расстояние между ними было другим.
Вот двухмерный пример.
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 , вы сможете увидеть эту технику в действии. это додекаэдр с выпуклыми гранями, чтобы он выглядел более круглым.