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 (incluido en Danzante)
 
Como indicio o incluso medida de la cercanía de dos esquletos (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 pra 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

 

Vea un retoque en

 

       '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 + Abs(angulo) : numero = numero + 1 _

                           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

             Next

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

             Return distancia_angula

       End Function

  

Más en
 
Distancias entre esqueletos II.
Distancias entre esqueletos III. Ruido
Distancias entre esqueletos IV.Funcion a minimizar
Distancias entre cuaterniones y matrices
 
 

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