1 votos

Bijección entre superficies triangulares esféricas y planas

Subdivido una esfera unitaria, centrada en el origen, en 20 triángulos esféricos. Por ejemplo, tomemos uno de estos triángulos $Ts$ , en $\mathbb{R}^3$ que tiene vértices $Normalize(-1,0,g), Normalize(0,g,1)$ y $Normalize(1,0,g)$ , donde $g = \frac{1.0+\sqrt{5}}{2}$ .

En el mismo tiempo hay otro triángulo plano equilátero $Tp$ , en $\mathbb{R}^2$ que tiene los siguientes vértices $(0,0), (1,0),(0.5, \frac{\sqrt{3}}{2})$ .

Estoy buscando una proyección (fórmula exacta) que cree una biyección de puntos de superficie de $Ts$ a los puntos de superficie de $Tp$ . Es crucial que dicho mapeo maximice la uniformidad de las distorsiones (no estoy seguro de cómo expresar esto en términos matemáticos estrictos).

0 votos

Tome cualquier similitud que lleve los vértices de $Ts$ a $Tp$ seguido por el evidente "aplanamiento" de $Ts$ .

0 votos

Soy bueno con la transformación $Ts$ vértices a $Tp$ los. Coinciden perfectamente. Sin embargo, es evidente que tengo problemas con la parte del "aplanamiento". Con el ingenuo (inverso $Tp$ , en $\mathbb{R}^2$ a $Ts$ , en $\mathbb{R}^3$ ) el mapeo me está dando puntos que están fuera del triángulo planar. Ver la imagen: i.snag.gy/GVYsAX.jpg Las marcas rojas representan aproximadamente dónde está el borde de mi triángulo planar.

1voto

Aretino Puntos 5384

Supongamos entonces que se aplica una transformación adecuada, de modo que los vértices del triángulo esférico sean los mismos que los del triángulo plano, sentándose entonces en el plano $z=0$ . Sea $O=(x_0,y_0,z_0)$ sea el centro de la esfera transformada y $P=(x,y,z)$ cualquier punto del triángulo esférico. Entonces puedes:

  1. Aplicar una traducción que lleve $O$ en el origen: $P\to P-O=(x-x_0,y-y_0,z-z_0)$ ;

  2. Diapositiva $P$ a lo largo de $PO$ hasta su $z$ la coordenada se convierte en $-z_0$ : $$ P\to {-z_0\over z-z_0}P=\left(-{x-x_0\over z-z_0}z_0,-{y-y_0\over z-z_0}z_0,-z_0 \right); $$

  3. Traduce de vuelta: $$ P\to P+(x_0,y_0,z_0)=\left({x_0z-xz_0\over z-z_0},{y_0z-yz_0\over z-z_0},0 \right). $$ Por favor, pregunte si algo no está claro.

0 votos

Todavía no he probado esto. Sin embargo, permítame hacerle una pregunta por adelantado.

0 votos

Sinceramente "gracias" por su respuesta. Estoy seguro de que es correcta, pero desgraciadamente he conseguido resolverlo yo mismo. Supongo que añadiré mi propia respuesta para que los futuros lectores se den cuenta.

1voto

lhog Puntos 27

Estoy seguro de que la respuesta que proporcionó @Aretino también funciona, pero dejo mi propia solución en aras de la integridad.

Esto es lo que he hecho yo mismo. Como los lectores habrán adivinado, mi objetivo era intentar proyectar los puntos de la superficie dentro de la cara del icosaedro en el respectivo triángulo esférico. El problema que tenía era que con el mapeo ingenuo el triángulo esférico "tomaría" los puntos de la superficie planar que están fuera del triángulo planar. Véase mi imagen, en la que he delineado el borde áspero del triángulo planar en uno de sus lados: https://i.snag.gy/GVYsAX.jpg

Inicialmente hice el mapeo de la siguiente manera:

  • obtener coordenadas baricéntricas: $baryP = getTriangleBarycentric(pos, icoFace[0], icoFace[1], icoFace[2]$$ );$

$pos$ es un punto de la esfera. $icoFace[0..3]$ son vértices de un icosaedro y del correspondiente triángulo esférico.

  • $planarPoint$ = $baryP.x * [0.0, 0.0] + baryP.y * [1.0, 0.0] + baryP.z * [0.5, \frac{\sqrt{3}}{2}]$

$planarPoint$ es un vector de dos componentes que representa los puntos del triángulo desde el que hago el mapa. $[0.0, 0.0] ; [1.0, 0.0] ; [0.5, \frac{\sqrt{3}}{2}]$ son puntos del triángulo desde los que hago el mapeo. Nota: este triángulo es similar (y equilátero) al triángulo plano icosaedro original. Es sólo una cuestión de preferencia para trabajar con el triángulo "unidad".

Así que ese fue el enfoque original y no funcionó.

Lo que hizo que funcionara es la siguiente transformación de $pos$ antes de que se utilice para calcular la coordenada baricéntrica correspondiente a $pos$ .

$triangleToPointDist = DistancePointToTriangle(pos, icoFace[0], icoFace[1], icoFace[2])$ $pos = pos * (1.0 - triangleToPointDist)$

Estas dos líneas proyectan esencialmente $pos$ de estar en la superficie del triángulo esférico a estar en el triángulo del icosaedro.

La falta de proyección de la esfera al triángulo plano del icodahedro fue mi único error.

P.D. Como lo hago para el shader WebGL (un programa que se ejecuta en la GPU), no puedo resistir la tentación de compartir el enlace al excelente resultado final: https://shaderfrog.com/app/view/2360

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X