La tetera de Utah , creada originalmente por Martin Newell, es un objeto conveniente para probar programas de gráficos en 3D.
La tarea es crear una imagen de alambre de la tetera en proyección en perspectiva. Para fomentar la idea de una aplicación de código fuente , la visualización y el control de la cámara pueden aislarse y excluirse del recuento. Esto es para que los parámetros y el archivo de entrada puedan modificarse y el código reutilizarse para generar diversas imágenes, pero no es necesario crear una utilidad completa que acepte argumentos de línea de comandos complicados o similares. Se busca un equilibrio "pirata informático".
árbitro. StackOverflow: ¿Cómo funcionan los parches Bezier en la tetera de Utah?
Aquí hay tres subtareas:
- lea los datos de la tetera en su formato original .
- subdividir los datos del parche utilizando la división deCasteljau u otro método. Otros métodos están utilizando matrices de base de Bezier y evaluando los polinomios (referencias estándar, como Foley y van Dam, Newmann y Sproull), o métodos de base de Bernstein (que todavía están más allá de mí).
- proyecte los puntos en 2D (si el lenguaje no es compatible con 3D de forma nativa) y dibuje el contorno de cada parche pequeño como se ve desde un punto de ojo cuya vista se centra en un punto LookAt y cuyo eje vertical está alineado con el eje vertical de la tetera (es decir, dibujarlo "en posición vertical" desde un buen punto de vista).
Asumiendo que leer datos de texto orientados a líneas de un archivo es un pequeño problema, este desafío se trata realmente de ponerse manos a la obra con los datos del parche Bi-Cubic Bezier.
Dado que la simple prueba normal para el sacrificio de la cara posterior no es suficiente (los parches no están todos orientados hacia afuera), no es necesaria la eliminación de la línea oculta o de la superficie. Como una estructura metálica, debería verse bien con la parte posterior visible. La apariencia puede mejorarse ajustando el ancho de línea dependiendo de la distancia desde el ojo, pero esto no es estrictamente necesario (mis propios programas no hacen esto).
Esto es a la vez código de golf y piedra de rosetta . Las respuestas que compiten en el golf deben incluir un conteo normal. Pero las presentaciones en idiomas inusuales son muy recomendables, incluso si no son particularmente cortas.
Para los entusiastas de la complejidad de Kolmogorov, hay un conjunto de datos más conciso donde el conjunto completo puede reconstruirse agregando rotaciones y duplicando parches. Y en A Trip Down the Graphics Pipeline de Jim Blinn , hay un método de generación aún más conciso al usar el hecho de que los parches individuales tienen simetrías rotacionales u otras. Todo el cuerpo (o tapa) puede describirse mediante una sola curva de Bezier que gira alrededor del eje y. La boquilla y los mangos se pueden describir mediante las dos curvas de su perfil y luego seleccionando los puntos de control intermedios para aproximar una extrusión circular.
fuente
glutSolidTeapot
yglutWireTeapot
!glutWireTeapot
.Respuestas:
Procesamiento (java), 314 (237 sin control de cámara)
Sin incluir las definiciones de matriz:
Definiciones de matriz de datos:
Versión más legible:
Y algunas fotos:
Otra versión con algunos efectos interesantes:
fuente
stroke(-1)
es un byte más corto questroke(255)
Posdata
No está totalmente golfizado, pero esto ilustra un enfoque diferente al de la subdivisión deCasteljau: evaluar el polinomio base. Usos mat.ps .
1112
Al eliminar las líneas verticales y descontar los parámetros, se obtiene esta versión 1112 char. Usos mat.ps .
fuente