М.5: Обобщённое рисование 2д фигур
В прошлых заметках я обращал внимание на то, что видеокарты очень плохо перемалывают объёмный код. И при создании универсальных шейдеров полезно бывает задуматься об упрощённых вычислениях.
На эту идею меня навела статья nabbla1 об ускоренной оценке длины вектора на плоскости. Евклидова длина вычисляется как корень из суммы квадратов координат. Школьники узнают это из формулы гипотенузы прямоугольного треугольника. Если прилежащий катет пустить из начала координат, получится как раз формула длины.
Если считать длину по Евклиду, то равноудалённые точки будут описывать окружность. Так и работает функция расстояния для круга: через длину и радиус. Но если мы изменим формулу длины, то изменится и положение равноудалённых точек:
Здесь чебышевская длина описывает квадрат, манхэттэнская ромб, а их сочетание через коэффициенты создаёт восьмиугольник. Особая прелесть в том, что вычислительная сложность у них совсем маленькая. От себя я добавил чуть более сложные шестиугольную и треугольную, которые, впрочем, тоже изящно сократились под случай симметрии.
Итого, 6 фигур из заголовка описываются через такой вот код:
Для сравнения, один только равносторонний треугольник описывается так:
Но тут самый внимательный читатель мог заметить одну интересную вещь: вокруг моих фигур полосы ломаные, а вокруг этого треугольника закруглённые. Это так называемые изолинии, которые и описывают фигуры из равноудалённых точек. В "точных" формулах, которые работают в евклидовом пространстве, изолинии при удалении от фигуры вырождаются в идеальную окружность. Этим, к слову, пользуются для операции скругления.
Изменив же саму формулу длины, мы меняем и пространство (не удивляйтесь потом, что какого-то математика сожгли на костре). И каждая изолиния, к сожалению, будет заострённой. Для двумерных фигур я это не считаю чем-то слишком важным.
Ну а про трёхмерные мы поговорим в следующих выпусках майского шейдерника.

