Deformación de imágenes a través de superficies

Esta entrada participa en la Edición 6.8 del Carnaval de Matemáticas,
cuyo anfitrión es el blog Gaussianos.

Os dejamos esta entrada fantástica de  Antonio Zarauz, alumno de la asignatura de Introducción a la Topología Algebraica, de la Universidad de Almería. Antonio es además editor de la sección «territorio  estudiante» del Boletín de la Titulación de Matemáticas de la UAL.


Descárgate el fichero ejecutable del Mathematica

Es natural preguntarse cómo, por ejemplo, los mapamundi que estamos acostumbrados a ver poseen una distribución rectangular, mientras que por otro lado nos enseñan que la Tierra es esférica (o, al menos, homeomorfa). La respuesta a ese hecho es sencilla, pero no perfecta; quiere decirse, podemos obtener una a partir de la otra mediante transformaciones que conserven ángulos o áreas, pero no las dos cosas simultáneamente.
El objetivo en este caso es, dada la imagen

5JpK4

obtener una representación más familiar como la siguiente, con la ayuda del Mathematica:

esferamapamundi

Durante todo el ejemplo iremos ilustrando valores concretos para centrar ideas, por lo que el lector es susceptible de modificar cuanto desee que no sea esencial.
Comenzaremos por ilustrar cómo introducir la imagen al programa. Para ello (llamaremos pic a la imagen durante todo el proceso) simplemente introducimos el directorio donde tengamos la imagen «mypicture.jpg»:

pic = Import[«C:\\….\\mypicture.jpg»];

Si además quisiéramos hacer algún tipo de recorte al margen vertical de tamaño w o al horizontal de tamaño h, hacemos

{width, height} = ImageDimensions[pic];
w = 40; h = 45;
pic = ImageTake[pic, {h, height – h}, {w, width – w}];

Lo único que ya queda por hacer es definir la superficie que queramos (en este caso la esfera) mediante el conocido comando ParametricPlot3D e incluir la imagen mediante el comando PlotStyle:

ParametricPlot3D[{Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]}, {u, 0,
2 Pi}, {v, 0, Pi}, Mesh -> None, PlotPoints -> 100,
TextureCoordinateFunction -> ({#4, 1 – #5} &), Boxed -> False,
PlotStyle -> Texture[Show[pic, ImageSize -> 1000]],
Lighting -> «Neutral», Axes -> False, RotationAction -> «Clip»,
ViewPoint -> {-2.026774, 2.07922, 1.73753418}, ImageSize -> 600]

El resto de opciones agregadas a dicho comando son libres de editar por el lector.

Eso es todo si lo que queremos es simplemente obtener el mapamundi. Pero también podemos obtener un cierto disfrute de este proceso, simplemente con una imagen nuestra y un poco de ingenio para parametrizar superficies. Concretamente, tomemos como ejemplo la imagen

11221309_10206184819572176_7780763422977696890_o

Aparte del bonito motivo matemático, se presenta sugerente saber, por ejemplo, cuál sería la estética de este imagen sobre una esfera, un cilindro, un cono, o por qué no, objetos más atrevidos (en un contexto topológico) como la banda de Möbius, un toro o incluso la botella de Klein. Para adaptar la imagen a las distintas figuras podemos ir haciendo convenientes recortes, y usando las siguientes parametrizaciones y el código anterior obtenemos lo que nos proponíamos.

ParametricPlot3D[{Cos[u] Sin[v], Sin[u] Sin[v], Cos[v]}, {u, 0,
2 Pi}, {v, 0, Pi}, Mesh -> None, PlotPoints -> 100,
TextureCoordinateFunction -> ({#4, 1 – #5} &), Boxed -> False,
PlotStyle -> Texture[Show[pic, ImageSize -> 1000]],
Lighting -> «Neutral», Axes -> False, RotationAction -> «Clip»,
ViewPoint -> {-2.026774, 2.07922, 1.73753418}, ImageSize -> 600]

Fotos en superficies1

ParametricPlot3D[{Cos[v], Sin[v], u}, {u, 0, 1}, {v, 0, 2*Pi},
Mesh -> None, PlotPoints -> 100,
TextureCoordinateFunction -> ({#4, 1 – #5} &), Boxed -> False,
PlotStyle -> Texture[Show[pic, ImageSize -> 1000]],
Lighting -> «Neutral», Axes -> False, RotationAction -> «Clip»,
ViewPoint -> {-2.026774, 2.07922, 1.73753418}, ImageSize -> 600]

Fotos en superficies2

 

ParametricPlot3D[{u*Cos[v], u*Sin[v], u}, {u, 0, 1}, {v, 0, 2*Pi},
Mesh -> None, PlotPoints -> 100,
TextureCoordinateFunction -> ({#4, 1 – #5} &), Boxed -> False,
PlotStyle -> Texture[Show[pic, ImageSize -> 1000]],
Lighting -> «Neutral», Axes -> False, RotationAction -> «Clip»,
ViewPoint -> {-2.026774, 2.07922, 1.73753418}, ImageSize -> 600]

Fotos en superficies4

ParametricPlot3D[{(1 + r*Cos[a/2])*Cos[a], (1 + r*Cos[a/2])*Sin[a],
r*Sin[a/2]}, {r, -1, 1}, {a, 0, 2*Pi}, Mesh -> None,
PlotPoints -> 100, TextureCoordinateFunction -> ({#4, 1 – #5} &),
Boxed -> False, PlotStyle -> Texture[Show[pic, ImageSize -> 1000]],
Lighting -> «Neutral», Axes -> False, RotationAction -> «Clip»,
ViewPoint -> {-2.026774, 2.07922, 1.73753418}, ImageSize -> 600]

Fotos en superficies3

ParametricPlot3D[{(2 + Cos[v])*Cos[u], (2 + Cos[v])*Sin[u],
Sin[v]}, {u, 0, 2*Pi}, {v, 0, 2*Pi}, Mesh -> None,
PlotPoints -> 100, TextureCoordinateFunction -> ({#4, 1 – #5} &),
Boxed -> False, PlotStyle -> Texture[Show[pic, ImageSize -> 1000]],
Lighting -> «Neutral», Axes -> False, RotationAction -> «Clip»,
ViewPoint -> {-2.026774, 2.07922, 1.73753418}, ImageSize -> 600]

Fotos en superficies5

El caso de la botella de Klein requiere un esfuerzo mayor a la hora de parametrizar la superficie, por lo que escribimos la parametrización por separado.

p[u_, v_] := Which[v < Pi,
{(2.5 – 1.5*Cos[v])*Cos[u], (2.5 – 1.5*Cos[v])*Sin[u], -2.5*Sin[v]},

v < 2*Pi,
{(2.5 – 1.5*Cos[v])*Cos[u], (2.5 – 1.5*Cos[v])*Sin[u], 3*v – 3*Pi},
v < 3*Pi, 
{-2 + (2 + Cos[u])*Cos[v], Sin[u], (2 + Cos[u])*Sin[v] + 3*Pi},
True,
{-2 + 2*Cos[v] – Cos[u], Sin[u], -3*v + 12*Pi}];
ParametricPlot3D[p[u, v],

{u, 0, 2 Pi}, {v, 0, 4 Pi}, Mesh -> None, PlotPoints -> 100,
TextureCoordinateFunction -> ({#4, 1 – #5} &), Boxed -> False,
PlotStyle -> Texture[Show[pic, ImageSize -> 1000]],
Lighting -> «Neutral», Axes -> False, RotationAction -> «Clip»,
ViewPoint -> {-2.026774, 2.07922, 1.73753418}, ImageSize -> 600]

Fotos en superficies6

En un contexto matemático, estas transformaciones no sólo permiten observar cómo podemos moldear un rectángulo, si no que también seremos capaces de estudiar familias de conjuntos subyacentes o propiedades tales como las bases de entornos o la continuidad, respectivamente, de las superficies de una forma más intuitiva.

Para consultar las transformaciones en un fichero notebook de Mathematica consultad el siguiente enlace. Podéis también visitar las entradas:


 

Tenemos previsto realizar esta actividad en la próxima Feria de la Ciencia de Sevilla, los días 6, 7 y 8 de mayo de 2016, como parte del proyecto ¿Qué superficie topológica tengo en mis manos?. Más información en breve.

Mientras, os animamos a dejar vuestras imágenes en superficies en los comentarios.

 

7 replies to “Deformación de imágenes a través de superficies

  1. Hola portfoliosonjasumonja, por lo general al hacer «copia-pega» del archivo original al blog (y/o viceversa) se pieden espacios o, en general, se modifica el programa. Al ser Mathematica muy restrictivo al respecto, suele dar errores. De todos modos, muy pronto subiremos el notebook original con todo detallado.

    Un saludo.

  2. Aquí van algunos fractales del Proyecto Alfombra de Sierpinski en superficies:

    The Sierpinski Carpet made by Paco Agis on topological surfaces. Other pictures are welcome. See how to make them with…

    Posted by Sierpinski Carpet Project on Wednesday, November 25, 2015

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto:
close-alt close collapse comment ellipsis expand gallery heart lock menu next pinned previous reply search share star