Один із способів це зробити - це почати з платонічного твердого тіла з трикутними сторонами - октаедра , наприклад. Потім візьміть кожен трикутник і рекурсивно розбийте його на менші трикутники, приблизно так:
Отримавши достатню кількість точок, ви нормалізуєте їх вектори так, щоб усі вони знаходились на постійній відстані від центру твердого тіла. Це призводить до того, що сторони випирають у форму, що нагадує сферу, із збільшенням плавності при збільшенні кількості точок.
Нормалізація тут означає переміщення точки так, щоб її кут по відношенню до іншої точки був однаковим, але відстань між ними інша. Ось двовимірний приклад.
А і В розташовані на відстані 6 одиниць. Але припустимо, ми хочемо знайти точку на прямій АВ, яка знаходиться на відстані 12 одиниць від точки А.
Можна сказати, що 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 , ви можете якось побачити цю техніку на роботі. це дванадцятигранник з випуклими гранями, щоб він виглядав круглішим.