Esta página está en construcción: perdonen los errores, repeticiones y temas inacabados.
 
This page is being developed: I am sorry for errors, duplications  and unfinished subjects.
 
 
Distancias entre esqueletos II (incluido en Danzante)
 
Las funciones distancias introducidas en Proyecto Danzante. Distancias entre esqueletos.htm se comportan muy bien en la búsqueda de mínimos. Sobre una superficie esférica, el arco de círculo máximo y su cuerda disminuyen monótonamente al acercarse dos puntos por ese círculo que es el más corto entre los posibles (otra cosa ocurre en esferas no perfectas, como la Tierra, con sus loxodromias). Algún círculo máximo no oscila, si su eje pasa por el punto destino. Si el círculo no es máximo, caso más frecuente, sigue habiendo una ondulación pero varía menos, teniendo una media no nula como línea de base.
 
Además arco y cuerda llegan a 0 y luego comienzan a crecer al sobrepasarlo. Si el círculo máximo no pasa por ambos puntos, entonces no obstante la distancia disminuye también monótonamente, pasando por un mínimo no nulo y luego creciendo. Estos círculos, 3 de ellos perpendiculares (circularmente perpendiculares) son los que corresponden a los giros que usamos para acercar dio pesqueletos en la estrategia de los microsaltos (ver Aproximacion por micropasos III y anteriores).
 
En IV.Funcion a minimizar obtenemos las ecuaciones y dibujamos esa función.
 
Como indicio o incluso medida de la cercanía de dos esqueletos (de cualquier tipo) podemos elegir varias, aunque todas ellas deberían tener en cuenta las distancias individuales entre puntos homólogos; de modo que algún tipo de promedio ha de hacerse con ellas, quizá ponderando algunas frente a otras. Aquellas nulas pueden contarse o no, según las coordenadas de los puntos sean reales o bien valores no usados en la distancia (por ejemplo, las articulaciones 12 a 19 no son tenidas en cuenta en la modalidad 'esqueleto sentado'.
 
Otro importante parámetro es el tipo de línea sobre la que se  mide las distancia: puede ser línea recta, óptima para las traslaciones. pero en los giros parece aconsejable usar medidas circulares, medidas de los arcos. O las medidas de los ángulos. Estos últimos tienen la ventaja de que no dependen de la distancia del punto al centro.
 
Repetimos la pregunta que nos hicimos en Movimientos y transformaciones en el espacio. ¿Qué les ocurre a las distancias entre nudos (articulaciones) homólogas cuando de gira un esqueleto o grafo?  En una traslación pura esas distancias son iguales, de modo que dejamos de lado ese movimiento. Sólo rotaciones, pues.
 
Las distancias en línea recta van a crecer más cuanto más alejados estén los nodos del centro de giro.
 
He aquí las funciones de DanzanteXI en VB que devuelven una de estas distancias:
 

'solo no nulos

       'CUIDADO que esta distancia es sólo para distancia de ROTACION (igual Referencia).

       'Si no, hay que referir a referencia primero

       'Para distancia bruta, tener en cuenta esa referencia

       Public Function distancia_pseudoskel(pseudoskel1() As Point4D, pseudoskel0() As Point4D) As Double

             'Dim ii As Byte

             Dim dista As Double = 0, dista_ii As Double

             Dim numero As Double = 0

             For ii = 0 To 20 - 1

                    If pseudoskel1(ii) <> p4nulo And pseudoskel0(ii) <> p4nulo Then

                           dista_ii = (pseudoskel1(ii).X - pseudoskel0(ii).X) ^ 2 + _

                                      (pseudoskel1(ii).Y - pseudoskel0(ii).Y) ^ 2 + _

                                      (pseudoskel1(ii).Z - pseudoskel0(ii).Z) ^ 2

                           If dista_ii > 0 Then dista = dista + Sqrt(dista_ii) : numero = numero + 1

                    End If

             Next

 

             If numero > 0 Then dista = dista / numero Else dista = 0

             Return dista

       End Function

 

 

       'Valores en grados sexagesimales 8los normales parta ángulos)

       'eje(Vector3D.CrossProduct(pseudoskel, pseudoskel0))

       'VA BIEN  ángulos entre 0º y 130º por ejemplo

       'Para distancia bruta, tener en cuenta la referencia. no el angulo bestia en sus sitios

       Public Function distancia_angular_pseudoskel(pseudoskel1() As Point4D, pseudoskel0() As Point4D) As Double

             Dim distancia_angula As Double

             'Dim vector1, vector2 As Vector3D

             Dim punto1, punto2 As Point3D

             Dim angulo As Double

             Dim numero As Double = 0

             Dim texto = "Angulos arti:"

             For ii = 0 To 20 - 1

                    'al centro

                    punto1 = punto3d_de_punto4(pseudoskel1(ii) - pseudoskel1(2)) :

                    punto2 = punto3d_de_punto4(pseudoskel0(ii) - pseudoskel0(2))

                    If punto1 <> p4nulo And punto2 <> p4nulo Then

                           angulo = Vector3D.AngleBetween(punto1, punto2)

                           If angulo > 0 Then

                                      distancia_angula = distancia_angula + angulo

                                      numero = numero + 1

                                      texto = texto + Str(ii) + ":" + Str(Int(angulo))

                           End If

                           texto = texto + Str(ii) + ":" + Str(Int(angulo))

                    End If

             Next

             If numero > 0 Then distancia_angula = distancia_angula / numero Else distancia_angula = 0

             texto = texto + "|" + (Str(Int(distancia_angula))) + "|"

             'Debug.Print(texto)

             Return distancia_angula

       End Function

 

       'Valores en grados sexagesimales 8los normales parta ángulos)

       'eje(Vector3D.CrossProduct(pseudoskel, pseudoskel0))

       'VA BIEN  ángulos entre 0º y 130º por ejemplo

       'Para distancia bruta, tener en cuenta la referencia. no el angulo bestia en sus sitios

       Public Function distancia_angular_pseudoskel_a_mano(pseudoskel1() As Point4D, pseudoskel0() As Point4D) As Double

             Dim distancia_angula As Double

             'Dim vector1, vector2 As Vector3D

             Dim punto1, punto2 As Point3D

             Dim angulo As Double

             Dim numero As Double = 0

 

             'Dim ii As Byte

             Dim dista As Double = 0, dista_ii As Double, r1, r2 As Double

             For ii = 0 To 20 - 1

                    'al centro

                    punto1 = punto3d_de_punto4(pseudoskel1(ii) - pseudoskel1(2))

                    punto2 = punto3d_de_punto4(pseudoskel0(ii) - pseudoskel0(2))

                    If punto1 <> p3nulo And punto2 <> p3nulo Then

                           '      If pseudoskel1(ii) <> p4nulo And pseudoskel0(ii) <> p4nulo Then

                           dista_ii = (punto1.X - punto2.X) ^ 2 + (punto1.Y - punto2.Y) ^ 2 + (punto1.Z - punto2.Z) ^ 2

                           If dista_ii > 0 Then

                                  r1 = Sqrt(punto1.X ^ 2 + punto1.Y ^ 2 + punto1.Z ^ 2)

                                  r2 = Sqrt(punto2.X ^ 2 + punto2.Y ^ 2 + punto2.Z ^ 2)

                                  dista = dista + Sqrt(dista_ii) 'numero = numero + 1

                                  angulo = 180 / PI * 2 * Asin(dista_ii / 2 / r1)

                                  If angulo > 0 Then

                                      distancia_angula = distancia_angula + angulo

                                      numero = numero + 1

                                      texto = texto + Str(ii) + ":" + Str(Int(angulo))

                                  End If

                           End If

                    End If

             Next

             If numero > 0 Then distancia_angula = distancia_angula / numero Else distancia_angula = 0

             Return distancia_angula

       End Function

  

 
Veamos ahora Proyecto Danzante. Distancias entre esqueletos III.Ruido. y Distancias entre esqueletos IV.Funcion a minimizar
 
 
 

 
Vuelta al Principio    Última actualización: domingo, 06 de septiembre de 2015    Visitantes: contador de visitas