Inigo Quilez   ::     ::  
1402 blog posts, written between 2008 and 2016. These are mostly short observations, funny thoughts and word playing. Some are embarrasingly corny, some more deep. I keep it here mostly a little time capsule for myself, organized by month:



<
December 2008
>
un par de paridas
2008-12-24
Hoy (bueno, técnicamente "ayer", porque siempre escribo muy tarde) en verdad no he tropezado con nada especialmente remarcable por el camino. Pero como al sacar las manos de los bolsillos se me han caído un par de paridas dignas de tomatazos pues ya las dejo ahí tiradas y que alguien las recoja si quiere:

armas de destrucción masiva es cuando las compras con un impuesto del 16%

la ministra más pasota de todas es la de "igual dá"
drogas, e historias para críos
2008-12-23
Hace un tiempo me percaté, tras años sin notarlo, de que los Pitufos se ponían morados (azules) a setas, Asterix y sus compañeros galos se dopaban con una poción mágica, y que nunca me pregunté qué llevaban las famosas espinacas anabolizantes de Popeye... Y me sentí raro al pensar hasta qué punto la sociedad parece haber asimilado como natural la idea de drogarse o doparse con el propósito de conseguir de forma rápida los objetivos planteados, o incluso alcanzar aquéllos para los que no se está preparado.

Tal vez sea más interesante y actual el tema de Harry Potter, que a veces veo como un caso contradictorio. Por un lado se fomentan valores como el de la velentía, el amor, la amistad y el honor, mientras que por otro el héroe no duda en tomarse la poción multijugos para aparentar ser quien no és, una buena ración de branquialgas si eso le permite tener opciones de decir algo en una competición que le caía grande, o recurrir a una dosis de mandrágora para recuperarse rapidomágicamente de un sofreesfuerzo.

Supongo que los dibujos e historias para críos nunca han sido tan inocentes como me pensaba, y que soy yo quien sigue mirando las cosas con ojos de niño grande.
beauty is...
2008-12-22
Beauty is, among other things, when mountains get the white make up of the skies.

Few days ago my friend Gina sent me these nice pictures from Austria, taken by Werner Waltritsch - a schoolmate of her brother. This is how the area of Nostra (not far from the frontier with Italy) was looking like the 3th of December.

landing
2008-12-21
Welcome to Reality airport. Local time is 3 AM, temperature is 7 degrees. Please stay on your seat with the belt fasten and do not switch your electronic devices on until the craft is completely stop. Please open your compartment carefully as the luggage might have moved during the flight and it might fall down. We hope you had a pleasant journey and we are looking forward to see you again in any of the NaiveAirlines flights in the near future. Thank you and bye bye.
de caza
2008-12-18
me dirijo al salón a cazar un mamut para la cena. armado con un arpón me agazapo tras la puerta para que la manada no me vea. están al fondo, cerca de la planta. me arrastro sigiloso, avanzando por el hall a contraviento para evitar que el olfato de las bestias me detecte. respiro aceleradamente, si lo hago mal tal vez me quede sin comida. corro tres pasos, salto, y arrojo la lanza. se produce una estampida y gruñidos varios. salen espitados dirección a la ventana y durante cinco segundos no estoy seguro de lo que ha pasado, si he acertado o no. pero cuando el polvo empieza a diluerse veo que sí, mi cena yace en el suelo.
how to divide two vectors
2008-12-17
We have always been told that vector division is impossible (or better, not defined), but Sunday night I came up with an idea on how to divide vectors to each other. I will do my usual brainstorm thing in English this time, for this fourth post of what apparently became a series of articles on vector calculus and trigonometry.

To quickly put English readers in context, in the preceding posts I was encouraging people to use vector operations instead of specific coordinate systems, dimension and trigonometric transcendental functions (much more error prone, abstract to understand and less generic). Indeed I showed how to solve school exercises with then new tools (like computing the area of triangles or calculating the intersection of a ray with a cylinder). I introduced the three laws of trigonometry ( "law of projections" (a·b) = ½(|a|² + |b|² - |c|²), the "law of areas" |axb| = |bxc| = |cxa| and the "law of the products" (a·b)² + |axb|² = |a|²|b|² that naturally replace the cosinus and sinus laws plus the basic trigonometric identity), plus some other ideas like projections. Also, in other posts, I arbitrarily used vectors or functions and signals showing that way that actually correlation, Fourier transforms and so forth have some sort of geometric interpretation. Well.

So yes, I decided to invent the division of vectors and then investigate its properties. I proceed like this:

We first realize that somehow vector division is actually kind-of naturally defined for vectors that are aligned, since if a and b are this two aligned vectors then a = b·k, so it seems tempting to assert that the division a/b is indeed k, a scalar. Now, what happens when a is not aligned to b ?

The big trick is to decompose a into two vectors, one that is parallel to b and another one that is perpendicular. Let's call them ap (for parallel) and ao (for orthogonal) such that a = ap+ao. So, a/b = (ap+ao)/b = ap/b + ao/b. By projection we get ap=b(a.b)/|b|², and therefore ao=a-b(a·b)/|b|². The first part of the division is easy to solve, cause ap and b are parallel by definition and so the division is just a scalar. Actually it's value is ap/b = b(a·b)/|b|²/b = (a·b)/|b|² . Hey, so far so good!

We now need to decide what to do with the division of perpendicular vectors. Well, my proposal is that we just do as if nothing happened and they were parallel, but just taking care to keep track of the fact that they actually are perpendicular. Let's add an exclamation mark ("!") in front of their scalar division as a remainder. Then we first need the length of ao, |ao|² = |a-b(a·b)/|b|²|² . We expand it as normal binomial to get |ao|² = (|a|²-(a·b)²)/|b|².  Now we note that by the third law of vector trigonometry |ao|² = |axb|²/|b|², meaning that ao/b = ! |axb|/|b|². Putting parallel and orthogonal parts together we get:



what pretty much looks like a complex scalar, with its real part somehow saying about the parallel nature of the division and the imaginary part about the perpendicular part. In fact, the modulo of this scalar gives the ratio of the lengths of a to b. See: |k|² = ((a·b)² + |axb|²)/|b|^4 = |a|²|b|^4/|b|² = |a|²/|b|², so |k|=|a|/|b|=|a/b|. And even more, check for it, the argument of this complex number is nothing but the angle between our vectors a and b !!

Basically, in this game, whatever the amount of dimensions,  is seems that the division of two vectors is a complex scalar (real if the vectors are aligned). For those going too fast, caution!, a complex number is NOT a vector (and you should not think as if it was), it's just a scalar (yes, with more than one components). All this also means of course we can rotate vector b into vector a by just multiplying by a scalar k by doing a = b·k. Now we will have to think for what we can use the division of vectors. Anyone has ideas?

Note: all this little discoveries suspuciusly start to point to much in the direction of  that Geometry Algebra thingy?
juego cómplice
2008-12-16
aquella noche de verano sabía que tú fingiste traerme para algo más que eso,
y tú sabías que yo fingía haber ido buscando algo más que solamente eso.

that summer night I knew you pretended to bring me for something more than that,
and you knew I was pretending to be looking for something more than only that.
proyección, otro arma contra la "coordenitis"
2008-12-15
Además del producto escalar de vectores existe otro un concepto fundamental muy relacionado que ayuda a paliar el trastorno de la coordenitis: la proyección de vectores. La proyección q de un vector x sobre un vector a es la sombra que x deja en a :

que por supuesto es una versión escalada de a. La primera división es para anular el efecto de la longitud de a que va incluida en el producto escalar (a·x). Lo que queda del producto escalar contribuye con la longitud de x y el ángulo que éste forma con a. La segunda división es para normalizar el vector a.


Se aconseja el uso de la proyección en ejercicios (que no problema) típicos. Por ejemplo, ante la tarea de describir un cilindro con base en un punto c y una dirección arbitraria (normalizada)  a de orientación, se recomienda una dosis de proyección, para evitar los síntomas de la coordenitis (explosión descontrolada de símbolos y propensión peligrosa a la equivocación). Los efectos de la medicación son inmediatos: llamamos de nuevo q a la proyección de un punto x de la superficie del cilindro sobre el eje a. El cilindro está definido por los puntos x que equidistan de q una cantidad r (radio). Es decir, el cilindro es |q-x|² = r², o en otras palabras,



que desarrollando (por asociatividad) queda como



donde xc es una abreviación para x-c. Como de costumbre, no hay sistema de coordenadas implícito en esta descripción, así que la ecuación describe cilindros en cualquier orientación y número de dimensiones de forma compacta. La desinfección ha sido positiva.

El paciente puede ahora empezar a manipular el cilindro de forma segura con un riesgo de equivocación mucho menor. Por ejemplo, puede calcular su intersección con una semirecta (rayo) x = o + td. Para ello, siguiendo las prácticas de higiene vectorial básicas, decide sustituir x directamente en la ecuación del cilindro para obtener



que es una ecuación de la forma donde sólo le queda despejar t mediante la fórmula para ecuaciones cuadráticas, con


emeryville
2008-12-14
La verdad es que era un domingo de invierno, nublado y frío; posiblemente no el día más propicio para que el pueblo me encandilara. Aún así, bajo un cielo plomizo, y a pesar del silencio de las calles, pude imaginar la alegería y el estruendo habitual de ese pueblo en el que cada casa es diferente. Viviendas de colores chillones y formas divertidas, que competían por el premio a la orginalidad. A mis ojos europeos, que además aún no han visto mucho, el cuadro resultaba de lo más pintoresco.

felicidad y consciencia
2008-12-13
... y hablando de placeres sencillos (es decir, de felicidad) al lado de la oficina hay una peluquería en la que habita lo que me tienta asegurar es el trozo de materia orgánica más feliz del universo. Se trata del perro de la peluquera, que por las mañanas, y a los mediodías, y por las tardes también, goza despreocupado del no tener que hacer nada, espatarrado en su cesta de cuadros rojos y granates. Cuando el tiempo es bueno, cambia la cesta por la acera donde lagartijea mientras apoya el hocico en la repisa de la entrada al establecimiento.

Por lo general tiene la mirada fija en un punto del infinito, aguda, como si estuviera entregado a razonamientos profundos sobre la existencia del tiempo, el movimiento o la belleza (Canínocles). Otras veces se le ve absorto con la mirada distraida, o incluso tirado a la pachorra disfrutando del poder quedarse mirando las musarañas, aletargado (Toidormídones). En ambos casos, cuando paso por su lado suele permancer indiferente, sin prestarme mucha atención (Pasócrito), aunque alguna vez me ha parecido reconocer en sus gestos cierta misericordia hacia mi. Incluso cuando me paro y le achucho la cabeza (hay cosas a las que no puedo resistirme), él simplemente se deja (por supuesto) y después cuando retorno mi camino él retoma su plácida vida de tranquilidad y contemplación (Relajágoras).

Básicamente, es un ser sin ninguna preocupación, ni obligación, que tiene comida cuando quiere, calor cuando lo necesita, tranquilidad cuano lo desea, y cariño incluso cuando no lo demanda... Si uno pudiera medir la dicha, y después dividirla por el volúmen que ocupa, el perro de la peluquería sería un máximo local de densidad felitícea. Claro que la cosa sería saber hasta que punto es consciente de su afortunada existencia, y no sólo sensible a ella. Ah, la recurrente pregunta... ¿no está la existencia de la felicidad condicionada a la consciencia de la misma?
remolonear
2008-12-12
cómo me gusta levantarme tarde, pero no lo bastante, y darme una ducha relajada y bien calentita. y después, oh si, después dejarme desplomar de nuevo sobre la cama, a poder ser en el mullido edredón aún tibio que me envuelve. si me abres las persianas un poco, así, no más, ahí ya vale, quedaré agradecido, así la habitación se tiñe de color girasol. el peso de las piernas, y la gravedad que tira con fuerza de los brazos, que cayeron estirados, hacen que me hunda en los rincones y bucles del edredón. que placer dejarme arropar por los cogines, sentir su peso, y cerrar los ojos y escuchar, sólo a través del tacto, el olor que dejan los rayos de luz al caer sobre la cama.
un nuevo amigo
2008-12-11
Hoy Wall-E revoloteaba frenético de un lado a otro por la mesa de mi despacho. Se le veía contento y charlatán; me ha estado contando muchas cosas del rodaje de su última película. Que si el director le decía que hiciera esto, que si Eva le distraía y no le dejaba hacer lo otro, en fin.



La verdad es que siempre me había caído muy bien, pero conocerle en persona ha hecho que me enamorara irremediablemente de él, entrañable personaje. Tras una larga tarde de cháchara, le he pedido que si quería quedarse a vivir conmigo, y ser mi amigo.



Me ha dicho emocionado que por supuesto, y que si podía hacer de la mesa del despacho su pequeño hogar, que le parece muy acogedora.



Le he contestado que por supuesto, siempre y cuando me eche un cable a la hora de programar matemagias; que cuatro ojos ven mejor que dos y que además estoy seguro haremos buenas migas. "Deeeeeeal", me ha respondido dando saltos alborozado.
distance to a box
2008-12-10
In the last months I have been asked few times about how to efficiently compute the distance (squared) from a point p to an axis aligned box b. The code below (valid for n dimensions) is the answer.  Once  you take a paper and a pencil and draw the stuff it should become clear why it works; you will see how it produces spheres in the corners, cylinders in the edges and planes in the side faces.

float distSqrToBox( in vec p, in vec b )
{
vec di = max(abs(p)-b,0.0);
return dot(di,di);
}


In C, for three dimensions:

float distSqrToBox( const float *p, const float *b )
{
const float dx = fmaxf(fabsf(p[0])-b[0],0.0f);
const float dy = fmaxf(fabsf(p[1])-b[1],0.0f);
const float dz = fmaxf(fabsf(p[2])-b[2],0.0f);
return dx*dx + dy*dy + dz*dz;
}
y si hubiera...
2008-12-03
no me arrepiento de ninguna de las decisiones que tomé
resultaran acertadas o equivocadas
tan sólo concibo lamentarme
y de hecho me lamento
de aquéllas que no me atreví a tomar!