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