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