He estado investigando y jugando con ejemplos de nubes de partículas en una visualización gráfica. La mayoría utilizan geometrías de forma para definir un campo de partículas, o parámetros para distribuirlas aleatoriamente por el campo de visión. Lo que me gustaría hacer es crear una nube de partículas en la que cada partícula tenga una proximidad relativa a una trayectoria vectorial invisible. Por ejemplo, si definiera una trayectoria vectorial ligeramente curvada, todas las partículas podrían flotar aleatoriamente dentro de un radio consistente a lo largo de esa trayectoria vectorial invisible y luego tal vez estrecharse hacia los extremos para formar una nube de partículas con forma de perrito caliente. He preguntado esto pregunta en StackOverflow y he obtenido algo de ayuda pero no una solución clara; entonces me di cuenta de que mi pregunta era principalmente un reto matemático y puede encontrar su mejor hogar aquí. Gracias por su consideración.
Respuestas
¿Demasiados anuncios?En primer lugar, necesitas tener una parametrización para tu trayectoria curva. Lo que quiero decir es que necesitas tener una función $p(t)$ con $t\in[0,1]$ que da el punto de la curva al barrer el parámetro desde $0$ a $1$ . Si está utilizando un spline polinómico, entonces ya tiene una parametrización natural.
A continuación, hay que definir una función de radio $r(t)$ . Este será un valor constante para $t$ no cerca de los puntos finales (por ejemplo, de $t=0.1$ a $t=0.9$ ), y quieres que vaya a cero en los puntos finales (digamos, linealmente).
Una forma de generar $n$ lugares de las partículas ahora es elegir $n$ valores aleatorios en $[0,1]$ correspondiente al parámetro $t$ . Para cada uno de estos $t$ se conoce el punto de la curva al que debe acercarse, y también el radio utilizando el $r(t)$ función. Ahora todo lo que tienes que hacer es, para cada aleatorio $t$ generar un punto aleatorio en la esfera centrado en $p(t)$ con radio $r(t)$ .
Generar un punto aleatorio en una esfera es difícil, así que es mejor usar un cubo alineado con el eje. Este esquema es probablemente lo suficientemente bueno para los efectos visuales, y usted puede ajustar más tarde si lo desea. Para evitar los desagradables racimos, puedes restringir para cada punto aleatorio $t$ valora el punto para que esté en el plano perpendicular a tu curva. Averiguar ese plano es fácil si tu parametrización también escupe el vector tangente (lo que hacen los splines, o puedes usar diferencias finitas).
Supongamos que su trayectoria curva tiene la ecuación paramétrica $\mathbf{C}(t)$ con $0 \le t \le 1$ . Puede ser una curva de Bézier, por ejemplo, o alguna otra curva. Además, supongamos que para cualquier $t$ se puede construir un "marco" en el punto correspondiente $\mathbf{C}(t)$ en la curva. Cuando digo "marco", me refiero a un conjunto de tres vectores unitarios mutuamente ortogonales. Hay muchas formas de construir esta trama; la más sencilla consiste en la tangente, la normal y la binormal de la curva en el punto dado. Llamemos a los tres vectores unitarios $\mathbf{U}(t)$ , $\mathbf{V}(t)$ , $\mathbf{W}(t)$ . Supongamos que $\mathbf{U}(t)$ y $\mathbf{V}(t)$ son perpendiculares a la curva, y $\mathbf{W}(t)$ es tangente a la curva
Supongamos que queremos que nuestra nube de puntos se encuentre a una distancia determinada $r$ de la curva - en otras palabras, nuestra nube de puntos tiene forma de "salchicha" con un diámetro de $2r$ . Supongamos que tenemos una función $\phi: [0,1] \to [0,1]$ que devuelve números aleatorios en el rango $[0,1]$ . Entonces la función $$ \mathbf{P}(t,u,v) = \mathbf{C}(t) + r\phi(u)\cos(2\pi v)\mathbf{U}(t) + r\phi(u)\sin(2\pi v)\mathbf{V}(t) $$ generará puntos en la "salchicha" como $t,u,v$ gama sobre $[0,1]$ .