Юта чайник , первоначально созданный Мартин Ньюэллы, является удобным объектом для тестирования графических программ 3D.
Задача состоит в том, чтобы создать каркасное изображение чайника в перспективной проекции. Чтобы поддержать идею приложения с исходным кодом , просмотр и управление камерой могут быть изолированы и исключены из подсчета. Это значит, что параметры и входной файл могут быть изменены, а код повторно использован для генерации разнородных изображений, но нет необходимости создавать полноценную утилиту, которая принимает сложные аргументы командной строки или тому подобное. Требуется «хакерский» баланс.
ссылка StackOverflow: Как работают патчи Безье в чайнике в Юте?
Итак, здесь есть три подзадачи:
- считывать данные чайника в исходном формате .
- подразделите данные патча, используя расщепление де Кастельхау или другой метод. Другие методы используют базисные матрицы Безье и оценивают полиномы (стандартные ссылки, такие как Фоли и Ван Дам, Ньюманн и Спроулл) или базисные методы Бернштейна (которые все еще находятся за пределами моего понимания ).
- спроецируйте точки в 2D (если язык не поддерживает 3D изначально) и нарисуйте контур каждого небольшого патча, если смотреть с точки глаза, вид которой центрирован на точке LookAt, а вертикальная ось совмещена с вертикальной осью чайника. (т. е. нарисовать его «в вертикальном положении» с хорошей точки зрения).
Если предположить, что чтение текстовых данных, ориентированных на строки, из файла представляет собой небольшую проблему, эта задача действительно заключается в том, чтобы получить практические данные с использованием патча Bi-Cubic Bezier.
Поскольку простого обычного теста для отбраковки задней поверхности недостаточно (все участки не ориентированы наружу), удаление скрытой линии или -surface не требуется. Как каркас, он должен выглядеть очень хорошо с видимой спиной. Внешний вид может быть улучшен путем настройки ширины линии в зависимости от расстояния от глаза, но это не является строго необходимым (мои собственные программы не делают этого).
Это и код-гольф, и розеттский камень . Ответы, участвующие в гольфе, должны включать в себя нормальный результат. Но материалы на необычных языках очень поощряются, даже если они не очень короткие.
Для энтузиастов сложности Колмогорова существует более сжатый набор данных, где полный набор может быть реконструирован путем добавления поворотов и зеркального отражения патчей. А в книге Джима Блинна « Путешествие по графическому конвейеру» есть еще более лаконичный метод генерации, использующий тот факт, что отдельные патчи имеют вращательную или другую симметрию. Все тело (или крышка) можно описать одной кривой Безье, которая вращается вокруг оси y. Излив и ручки можно описать двумя кривыми их профиля, а затем выбрать промежуточные контрольные точки для аппроксимации круговой экструзии.
источник
glutSolidTeapot
иglutWireTeapot
!glutWireTeapot
.Ответы:
Обработка (Java), 314 (237 без управления камерой)
Не включая определения массива:
Определения массива данных:
Более читаемая версия:
И некоторые фото:
Еще одна версия с некоторыми интересными эффектами:
источник
stroke(-1)
на один байт корочеstroke(255)
постскриптум
Не полностью игра в гольф, но это иллюстрирует иной подход, чем подразделение де Кастеляу: оценка базисного полинома. Пользы mat.ps .
1112
Удаление вертикальных линий и дисконтирование параметров дает эту версию 1112 символов. Пользы mat.ps .
источник