Casos de Uso para Pruebas Automatizadas de UI - Sistema de Posturografía¶
Índice¶
- Información General
- Calibración del Sistema
- Vista Anterior (Frente)
- Vista Posterior (Espalda)
- Vista Lateral Derecha (Perfil Derecho)
- Vista Lateral Izquierda (Perfil Izquierda)
- Valores de Referencia Diagnóstica
- Estructura de Archivos .mat
Información General¶
Factor de Calibración (FC)¶
- Definición: Conversión de píxeles a centímetros
- Cálculo:
FC = 10 / D12donde D12 es la distancia en píxeles entre dos puntos de la grilla separados 10 cm - Uso: Todas las mediciones en píxeles se multiplican por FC para obtener centímetros
Líneas de Referencia (LRV - Línea de Referencia Vertical)¶
- LRV Horizontal (Hx1, Hy1, Hx2, Hy2): Línea horizontal a nivel de maleolos
- LRV Vertical (Vx1, Vy1, Vx2, Vy2): Línea vertical perpendicular que pasa por el punto medio de los maleolos
- Uso: Todas las mediciones de desviación se calculan respecto a estas líneas
Calibración del Sistema¶
Secuencia de Calibración¶
- Cargar Imagen
- Botón:
TagAbrirImagen - Formato: JPG
-
Resultado: Imagen cargada en
axes1 -
Calibrar con Grilla
- Botón:
TagCalibracion(oTagCalibracionGrilla) - Acción: Click en dos puntos de la grilla separados 10 cm
- Coordenadas ejemplo:
Punto 1: (X1, Y1) = (100, 500) Punto 2: (X2, Y2) = (200, 500) - Cálculo:
D12 = sqrt((X1-X2)^2 + (Y1-Y2)^2) FC = 10 / D12 -
Valor esperado FC: ~0.1 (típico para distancia de 100 píxeles = 10 cm)
-
Importar Marcadores
- Botón:
TagImportarMarcadores(oTagMarcadores) - Archivo:
Marcadores_ID_ML_*.mat -
Estructura del archivo:
- cell_res: array Nx4 donde cada fila contiene: [nombre_marcador, ?, X_coordenada, Y_coordenada] - ID: identificador del sujeto -
Trazar Rectas de Referencia
- Botón:
TagRectasRef(oReferenciasTag) -
Horizontal (Maleolos):
- Click en maleolo derecho externo
- Click en maleolo izquierdo externo
- Guarda:
(Hx1, Hy1, Hx2, Hy2) - Calcula distancia de maleolos en cm:
DistanciaMaleolos = FC * sqrt((Hx1-Hx2)^2 + (Hy1-Hy2)^2)
-
Vertical (LRV):
- Calcula punto medio:
p1x = Hx1 + (sqrt((Hx1-Hx2)^2 + (Hy1-Hy2)^2) / 2) - Traza vertical desde
p1y = Hy1hastap2y = p1y - (200/FC) - Guarda:
(Vx1, Vy1, Vx2, Vy2)
- Calcula punto medio:
Vista Anterior (Frente)¶
Archivo MATLAB¶
InterfazMedicionFrenteJulio2024v2 (1).m
Marcadores Utilizados¶
| Marcador | Descripción | Uso |
|---|---|---|
Tragus Der. / Lóbulo Oreja Der. |
Oreja derecha | Inclinación cabeza |
Tragus Izq. / Lóbulo Oreja Izq. |
Oreja izquierda | Inclinación cabeza |
Eminencia Frontal Media |
Frente | Rotación cabeza |
Espina Nasal |
Nariz | Rotación cabeza |
Punto Mentoniano |
Mentón | Rotación cabeza |
Punto Acromion Der. |
Hombro derecho | Inclinación hombros |
Punto Acromion Izq. |
Hombro izquierdo | Inclinación hombros |
Escotadura Esternal |
Horquilla esternal | Rotación tronco |
Apéndice Xifoides |
Xifoides | Rotación tronco |
Punto Sínfisis Pubiana |
Pubis | Rotación tronco |
Espina Iliaca Anterosuperior Der. |
Cadera derecha | Inclinación pelvis |
Espina Iliaca Anterosuperior Izq. |
Cadera izquierda | Inclinación pelvis |
Centro Rotula Der. |
Rótula derecha | Ángulo Q |
Centro Rotula Izq. |
Rótula izquierda | Ángulo Q |
TAT Der |
Tuberosidad tibial anterior derecha | Ángulo Q |
TAT Izq |
Tuberosidad tibial anterior izquierda | Ángulo Q |
Workflow - Vista Anterior¶
1. Región Cérvico-Cefálica¶
Botón: TagCervicoCefalico_Callback
Cálculos:
-
Inclinación de Cabeza (Línea entre tragus/lóbulos)
Marcadores: 'Tragus Der.' (o 'Lóbulo Oreja Der.'), 'Tragus Izq.' (o 'Lóbulo Oreja Izq.') X1 = matXY(Tragus_Izq, 1) Y1 = matXY(Tragus_Izq, 2) X2 = matXY(Tragus_Der, 1) Y2 = matXY(Tragus_Der, 2) # Trazar línea entre puntos # Calcular ángulo: Si Y1 < Y2: # Cae a la derecha A = [X2-X1, Y1-Y1] B = [X2-X1, Y2-Y1] gradosCC = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si gradosCC > 2: diagnóstico = 'derecha' Sino: diagnóstico = 'neutro' Sino: # Cae a la izquierda A = [X1-X2, Y2-Y2] B = [X1-X2, Y1-Y2] gradosCC = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si abs(gradosCC) > 2: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro' -
Rotación Eminencia Frontal Media
Marcador: 'Eminencia Frontal Media' XEFM = matXY(EFM, 1) DISTANCIAEMFCM = FC * (Vx1 - XEFM) Si DISTANCIAEMFCM > 1: diagnóstico = 'derecha' Si DISTANCIAEMFCM < -1: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro' -
Rotación Espina Nasal
Marcador: 'Espina Nasal' XEN = matXY(EN, 1) DISTANCIAENCM = FC * (Vx1 - XEN) Si DISTANCIAENCM > 1: diagnóstico = 'derecha' Si DISTANCIAENCM < -1: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro' -
Rotación Punto Mentoniano
Marcador: 'Punto Mentoniano' XPM = matXY(PM, 1) DISTANCIAPMCM = FC * (Vx1 - XPM) Si DISTANCIAPMCM > 1: diagnóstico = 'derecha' Si DISTANCIAPMCM < -1: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro'
Resultados Esperados:
Región: Cervico - cefálica
Variables:
- Ángulo de inclinación cabeza [°]: gradosCC
- Rotación Eminencia Frontal Media [cm]: DISTANCIAEMFCM
- Rotación Espina Nasal [cm]: DISTANCIAENCM
- Rotación Punto Mentoniano [cm]: DISTANCIAPMCM
2. Región Tronco-Columna¶
Botón: TagTroncoColumna
Cálculos:
-
Rotación Escotadura Esternal
Marcador: 'Escotadura Esternal' XEE = matXY(EE, 1) DISTANCIAEECM = FC * (Vx1 - XEE) Si DISTANCIAEECM > 1: diagnóstico = 'derecha' Si DISTANCIAEECM < -1: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro' -
Rotación Apéndice Xifoides
Marcador: 'Apéndice Xifoides' XAX = matXY(AX, 1) DISTANCIAAXCM = FC * (Vx1 - XAX) Si DISTANCIAAXCM > 1: diagnóstico = 'derecha' Si DISTANCIAAXCM < -1: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro' -
Rotación Sínfisis Pubiana
Marcador: 'Punto Sínfisis Pubiana' XPSP = matXY(PSP, 1) DISTANCIAPSPCM = FC * (Vx1 - XPSP) Si DISTANCIAPSPCM > 1: diagnóstico = 'derecha' Si DISTANCIAPSPCM < -1: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro' -
Inclinación de Tronco (Línea entre PSP y EE)
Marcadores: 'Escotadura Esternal', 'Punto Sínfisis Pubiana' # Trazar línea entre XPSP, YPSP y XEE, YEE A = [XEE-XPSP, YEE-YPSP] B = [XPSP-XPSP, YEE-YPSP] gradosTronco = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si gradosTronco > 2: Si XEE < Vx1: diagnóstico = 'derecha' Sino: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro'
Resultados Esperados:
Región: Tronco - Columna
Variables:
- Rotación Escotadura Esternal [cm]: DISTANCIAEECM
- Rotación Apéndice Xifoides [cm]: DISTANCIAAXCM
- Rotación Sínfisis Pubiana [cm]: DISTANCIAPSPCM
- Ángulo de Inclinación Tronco [°]: gradosTronco
3. Cintura Escapular - Miembro Superior¶
Botón: TagHombroMSuperior
Cálculos:
- Inclinación de Hombros (Línea entre acromions)
Marcadores: 'Punto Acromion Der.', 'Punto Acromion Izq.' X1 = matXY(AcromionDer, 1) # Hombro derecho (izquierda de la foto) Y1 = matXY(AcromionDer, 2) X2 = matXY(AcromionIzq, 1) # Hombro izquierdo (derecha de la foto) Y2 = matXY(AcromionIzq, 2) # Trazar línea entre puntos # Y1 derecho, Y2 izquierdo, el valor menor está más arriba Si Y2 < Y1: # Cae a la derecha A = [X1-X2, Y2-Y2] B = [X1-X2, Y1-Y2] gradosHombros = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si gradosHombros > 2: diagnóstico = 'derecha' Sino: diagnóstico = 'neutro' Sino: # Cae a la izquierda A = [X2-X1, Y1-Y1] B = [X2-X1, Y2-Y1] gradosHombros = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si abs(gradosHombros) > 2: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro'
Resultados Esperados:
Región: C. Escapular - M. Superior
Variables:
- Ángulo de Inclinación hombros [°]: gradosHombros
4. Cintura Pélvica - Miembro Inferior¶
Botón: TagPelvisMInferior
Cálculos:
-
Inclinación de Pelvis (Línea entre espinas iliacas)
Marcadores: 'Espina Iliaca Anterosuperior Izq.', 'Espina Iliaca Anterosuperior Der.' X1 = matXY(EIAS_Izq, 1) # Izquierda de la foto Y1 = matXY(EIAS_Izq, 2) X2 = matXY(EIAS_Der, 1) # Derecha de la foto Y2 = matXY(EIAS_Der, 2) # Trazar línea entre puntos # Y1 es izquierdo, Y2 es derecho Si Y1 < Y2: # Cae a la derecha, positivo A = [X2-X1, Y1-Y1] B = [X2-X1, Y2-Y1] gradosPMI = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si gradosPMI > 2: diagnóstico = 'derecha' Sino: diagnóstico = 'neutro' Sino: # Cae a la izquierda, negativo A = [X1-X2, Y2-Y2] B = [X1-X2, Y1-Y2] gradosPMI = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si abs(gradosPMI) > 2: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro' -
Ángulo Q Derecho (Ángulo entre EIAS, Rótula y TAT)
Marcadores: 'Espina Iliaca Anterosuperior Der.', 'Centro Rotula Der.', 'TAT Der' # Trazar líneas: # - Línea 1: TAT Der -> Centro Rotula Der (amarillo) # - Línea 2: Centro Rotula Der -> EIAS Der (amarillo) A = [TATDerX - RotulaDerX, TATDerY - RotulaDerY] B = [EspIliDerX - RotulaDerX, EspIliDerY - RotulaDerY] anguloQDerecho = abs(180 - rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))) Si anguloQDerecho > 6 Y anguloQDerecho < 27: diagnóstico = 'normal' Si anguloQDerecho >= 27: diagnóstico = 'aumentado' Si anguloQDerecho <= 6: diagnóstico = 'disminuido' -
Ángulo Q Izquierdo (Ángulo entre EIAS, Rótula y TAT)
Marcadores: 'Espina Iliaca Anterosuperior Izq.', 'Centro Rotula Izq.', 'TAT Izq' # Trazar líneas: # - Línea 1: TAT Izq -> Centro Rotula Izq (amarillo) # - Línea 2: Centro Rotula Izq -> EIAS Izq (amarillo) A = [TATIzqX - RotulaIzqX, TATIzqY - RotulaIzqY] B = [EspIliIzqX - RotulaIzqX, EspIliIzqY - RotulaIzqY] anguloQIzquierdo = abs(180 - rad2deg(acos(dot(A,B) / (norm(A)*norm(B))))) Si anguloQIzquierdo > 6 Y anguloQIzquierdo < 27: diagnóstico = 'normal' Si anguloQIzquierdo >= 27: diagnóstico = 'aumentado' Si anguloQIzquierdo <= 6: diagnóstico = 'disminuido' -
Medidas Manuales de Miembro Inferior
- Botón:
TagMedidas - ListBox: Seleccionar 'Condilos' o 'Gemelos'
-
Acción: Click en dos puntos para medir distancia horizontal
DistanciaLista = x2 - x1 DistanciaListaCM = FC * DistanciaLista -
Diagnóstico de Miembro Inferior (Genu Varo/Valgo)
# Basado en: DistanciaCondilos, DistanciaGemelos, DistanciaMaleolos Si DistanciaMaleolos < 1: Si DistanciaCondilos < 1: diagnóstico = 'Neutro' Sino: diagnóstico = 'Genu Varo' Sino: Si DistanciaMaleolos > DistanciaCondilos: diagnóstico = 'Genu Valgo' Sino: diagnóstico = 'Genu Varo'
Resultados Esperados:
Región: C. Pélvica - M. Inferior
Variables:
- Ángulo de Inclinación Pelvis [°]: gradosPMI
- Distancia Cóndilos [cm]: DistanciaCondilos
- Distancia Gemelos [cm]: DistanciaGemelos
- Distancia Maléolos [cm]: DistanciaMaleolos
- Ángulo Q Derecho [°]: anguloQDerecho
- Ángulo Q Izquierdo [°]: anguloQIzquierdo
Vista Posterior (Espalda)¶
Archivo MATLAB¶
InterfazMedicionEspaldaJulio2024v2 (1).m
Marcadores Utilizados¶
| Marcador | Descripción | Uso |
|---|---|---|
Tragus Der. |
Oreja derecha | Inclinación cabeza |
Tragus Izq. |
Oreja izquierda | Inclinación cabeza |
Lóbulo Izq |
Lóbulo oreja izquierda | Inclinación cabeza (alternativo) |
Lóbulo Der |
Lóbulo oreja derecha | Inclinación cabeza (alternativo) |
Punto Interno Espina Omóplato Izq (línea medial) |
Escápula izquierda superior | Asimetría escapular |
Ángulo Inferior Omóplato Izq |
Escápula izquierda inferior | Asimetría escapular |
Punto Interno Espina Omóplato Der (línea medial) |
Escápula derecha superior | Asimetría escapular |
Ángulo Inferior Omóplato Der |
Escápula derecha inferior | Asimetría escapular |
Cervical 7 |
Vértebra C7 | Desbalance coronal |
Torácica 3 |
Vértebra T3 | Desbalance coronal |
Torácica 7 |
Vértebra T7 | Desbalance coronal |
Torácica 12 |
Vértebra T12 | Desbalance coronal |
Lumbar 5 |
Vértebra L5 | Desbalance coronal |
Espina iliaca posterosuperior izquierda |
EIPS izquierda | Inclinación pelvis |
Espina iliaca posterosuperior derecha |
EIPS derecha | Inclinación pelvis |
Calcáneo Izq |
Calcáneo izquierdo | Ángulo calcáneo |
Aquiles Izq |
Tendón Aquiles izquierdo | Ángulo calcáneo |
Calcáneo Der |
Calcáneo derecho | Ángulo calcáneo |
Aquiles Der |
Tendón Aquiles derecho | Ángulo calcáneo |
Workflow - Vista Posterior¶
1. Región Cérvico-Cefálica¶
Botón: TagCervicoCefalica
Cálculos:
- Distancias de Tragus a LVR
Marcador: 'Tragus Izq.' X1 = matXY(Tragus_Izq, 1) Dizqcm = FC * abs(Vx1 - X1) Marcador: 'Tragus Der.' X2 = matXY(Tragus_Der, 1) Ddercm = FC * abs(Vx1 - X2) # Calcular ángulo entre tragus: angulo_tragus = (angle((X2-X1) + (Y2-Y1)*i) * 180) / pi
Resultados Esperados:
Región: Cervico - cefálica
Variables:
- Distancia Tragus Izq a LVR [cm]: Dizqcm
- Distancia Tragus Der a LVR [cm]: Ddercm
- Ángulo Tragus [°]: angulo_tragus
2. Región Cintura Escapular¶
Botón: TagCinturaEscapular
Cálculos:
-
Escápula Izquierda
Marcadores: 'Punto Interno Espina Omóplato Izq (línea medial)', 'Ángulo Inferior Omóplato Izq' X1 = matXY(PuntoInternoIzq, 1) Y1 = matXY(PuntoInternoIzq, 2) DizSupIzqcm = FC * abs(Vx1 - X1) X2 = matXY(AnguloInferiorIzq, 1) Y2 = matXY(AnguloInferiorIzq, 2) DizInfIzqcm = FC * abs(Vx1 - X2) # Trazar líneas: # - Línea 1: Punto Interno Izq -> Ángulo Inferior Izq # - Línea 2: Punto Interno Izq -> Vx1 (horizontal) # - Línea 3: Ángulo Inferior Izq -> Vx1 (horizontal) # Calcular ángulo respecto a la vertical: Angulo1grados = abs(angle((X2-X1)+(Y2-Y1)*i)) - (pi/2) Angulo1grados = (Angulo1grados * 180) / pi -
Escápula Derecha
Marcadores: 'Punto Interno Espina Omóplato Der (línea medial)', 'Ángulo Inferior Omóplato Der' X1 = matXY(PuntoInternoDer, 1) Y1 = matXY(PuntoInternoDer, 2) DderSupcm = FC * abs(Vx1 - X1) X2 = matXY(AnguloInferiorDer, 1) Y2 = matXY(AnguloInferiorDer, 2) DderInfcm = FC * abs(Vx1 - X2) # Trazar líneas: # - Línea 1: Punto Interno Der -> Ángulo Inferior Der # - Línea 2: Punto Interno Der -> Vx1 (horizontal) # - Línea 3: Ángulo Inferior Der -> Vx1 (horizontal) # Calcular ángulo respecto a la vertical: Angulo2grados = abs(angle((X2-X1)+(Y2-Y1)*i)) - (pi/2) Angulo2grados = (Angulo2grados * 180) / pi -
Diagnóstico de Asimetría
Si abs(DizSupIzqcm - DderSupcm) > 1: DiagnosticoSup = 'Asimétrico' Sino: DiagnosticoSup = 'Simétrico' Si abs(DizInfIzqcm - DderInfcm) > 1: DiagnosticoInf = 'Asimétrico' Sino: DiagnosticoInf = 'Simétrico'
Resultados Esperados:
Región: C. Escapular - M. Superior
Variables:
- Punto Interno Espina Omóplato Izq [cm]: DizSupIzqcm
- Punto del Ángulo Inferior Omóplato Izq [cm]: DizInfIzqcm
- Punto Interno Espina Omóplato Der [cm]: DderSupcm
- Punto del Ángulo Inferior Omóplato Der [cm]: DderInfcm
3. Región Cabeza (Inclinación)¶
Botón: TagCabeza
Cálculos:
- Inclinación de Cabeza (Línea entre lóbulos)
Marcadores: 'Lóbulo Izq', 'Lóbulo Der' X1 = matXY(LobuloIzq, 1) Y1 = matXY(LobuloIzq, 2) X2 = matXY(LobuloDer, 1) Y2 = matXY(LobuloDer, 2) Si Y1 < Y2: # Cae a la derecha A = [X2-X1, Y1-Y1] B = [X2-X1, Y2-Y1] gradosCabeza = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si gradosCabeza > 2: diagnóstico = 'derecha' Sino: diagnóstico = 'neutro' Sino: # Cae a la izquierda A = [X1-X2, Y2-Y2] B = [X1-X2, Y1-Y2] gradosCabeza = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si abs(gradosCabeza) > 2: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro'
Resultados Esperados:
Región: Cervico - cefálica
Variables:
- Ángulo de Inclinación cabeza [°]: gradosCabeza
4. Región Tronco-Columna¶
Botón: TagTroncoycolumna
Cálculos:
- Desbalance Coronal de Vértebras
# Para cada vértebra: C7, T3, T7, T12, L5 Marcador: 'Cervical 7' XC7 = matXY(C7, 1) Dist_C7 = FC * (XC7 - Vx1) # POSITIVO: espinosa a la derecha (desbalance coronal derecha) # NEGATIVO: espinosa a la izquierda (desbalance coronal izquierda) Si Dist_C7 > 1: Diag_C7 = 'Derecha' Si Dist_C7 < -1: Diag_C7 = 'Izquierda' Sino: Diag_C7 = 'Neutro' # Repetir para T3, T7, T12, L5
Resultados Esperados:
Región: Tronco - Columna
Variables:
- Desbalance coronal C7 [cm]: Dist_C7
- Desbalance coronal T3 [cm]: Dist_T3
- Desbalance coronal T7 [cm]: Dist_T7
- Desbalance coronal T12 [cm]: Dist_T12
- Desbalance coronal L5 [cm]: Dist_L5
5. Región Cintura Pélvica - Miembro Inferior¶
Botón: TagMiembroInferior
Cálculos:
-
Inclinación de Pelvis (Línea entre EIPS)
Marcadores: 'Espina iliaca posterosuperior izquierda', 'Espina iliaca posterosuperior derecha' X1 = matXY(EIPS_Izq, 1) Y1 = matXY(EIPS_Izq, 2) X2 = matXY(EIPS_Der, 1) Y2 = matXY(EIPS_Der, 2) # Trazar línea entre puntos Si Y1 > Y2: # Cae a la izquierda (foto posterior) gradosPelvis = -(180 - (angle((X1-X2)+(Y1-Y2)*i)*180 / pi)) Si abs(gradosPelvis) > 1: diagnóstico = 'izquierda' Sino: diagnóstico = 'neutro' Sino: # Cae a la derecha gradosPelvis = 180 - abs(angle((X1-X2)+(Y1-Y2)*i)*180 / pi) Si abs(gradosPelvis) > 1: diagnóstico = 'derecha' Sino: diagnóstico = 'neutro' -
Medidas Manuales de Miembro Inferior
- Botón:
TomarMedida - ListBox: Seleccionar 'Condilos' o 'Gemelos'
-
Acción: Click en dos puntos para medir distancia horizontal
-
Diagnóstico de Miembro Inferior (Genu Varo/Valgo)
# Basado en: DistanciaCondilosEspalda, DistanciaGemelosEspalda, DistanciaMaleolosEspalda Si DistanciaMaleolosEspalda < 1: Si DistanciaCondilosEspalda < 1: diagnóstico = 'Neutro' Sino: diagnóstico = 'Genu Varo' Sino: Si DistanciaMaleolosEspalda > DistanciaCondilosEspalda: diagnóstico = 'Genu Valgo' Sino: diagnóstico = 'Genu Varo'
Resultados Esperados:
Región: C. Pélvica - M. Inferior
Variables:
- Ángulo de Inclinación Pelvis [°]: gradosPelvis
- Distancia Cóndilos [cm]: DistanciaCondilosEspalda
- Distancia Gemelos [cm]: DistanciaGemelosEspalda
- Distancia Maléolos [cm]: DistanciaMaleolosEspalda
6. Ángulo Calcáneo¶
Botones: TagAnguloCalcaneo (Izquierdo), pushbutton20 (Derecho)
Cálculos:
-
Ángulo Calcáneo Izquierdo
# PASO 1: Tomar puntos del pliegue poplíteo izquierdo (manual) # Click 1: Punto 1 del pliegue (x1, y1) # Click 2: Punto 2 del pliegue (x2, y2) # Trazar línea entre puntos DistPopliIzq = sqrt((x1-x2)^2 + (y1-y2)^2) Mitad = DistPopliIzq / 2 alfa = angle((x1-x2) + (y1-y2)*i) X = abs(Mitad * cos(alfa)) Y = abs(Mitad * sin(alfa)) XfinalIzq = X + x1 YfinalIzq = y1 - Y # Marcar punto medio (rojo) # PASO 2: Obtener marcadores Marcador: 'Calcáneo Izq' XCALIZQ = matXY(CalcaneoIzq, 1) YCALIZQ = matXY(CalcaneoIzq, 2) # Marcar punto (rojo) Marcador: 'Aquiles Izq' XAQUILESIZQ = matXY(AquilesIzq, 1) YAQUILESIZQ = matXY(AquilesIzq, 2) # Marcar punto (rojo) # PASO 3: Trazar líneas # Línea 1: Aquiles Izq -> Punto medio poplíteo # Línea 2: Aquiles Izq -> Calcáneo Izq # PASO 4: Calcular ángulo A = [XfinalIzq - XAQUILESIZQ, YfinalIzq - YAQUILESIZQ] B = [XCALIZQ - XAQUILESIZQ, YCALIZQ - YAQUILESIZQ] angulocalcaneoizq = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) # PASO 5: Diagnóstico Si angulocalcaneoizq > 178: diagnóstico = 'neutro' Sino: Si XAQUILESIZQ < XCALIZQ: # Abre hacia adentro diagnóstico = 'Calcáneo varo = supinado' angulocalcaneoizq = -angulocalcaneoizq Sino: # Abre hacia afuera diagnóstico = 'Calcáneo valgo = pronado' -
Ángulo Calcáneo Derecho
# PASO 1: Tomar puntos del pliegue poplíteo derecho (manual) # Similar al izquierdo, pero con puntos derechos # PASO 2: Obtener marcadores 'Calcáneo Der', 'Aquiles Der' # PASO 3: Trazar líneas # PASO 4: Calcular ángulo A = [XfinalDer - XCALDER, YfinalDer - YCALDER] B = [XCALDER - XAQUILESDER, YCALDER - YAQUILESDER] angulocalcaneoder = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) # PASO 5: Diagnóstico Si angulocalcaneoder > 178: diagnóstico = 'neutro' Sino: Si XAQUILESDER < XCALDER: # Abre hacia lateral diagnóstico = 'Calcáneo valgo = pronado' Sino: # Abre hacia adentro diagnóstico = 'Calcáneo varo = supinado' angulocalcaneoder = -angulocalcaneoder
Resultados Esperados:
Región: C. Pélvica - M. Inferior
Variables:
- Ángulo Calcáneo Izquierdo [°]: angulocalcaneoizq
- Ángulo Calcáneo Derecho [°]: angulocalcaneoder
Vista Lateral Derecha (Perfil Derecho)¶
Archivo MATLAB¶
InterfazMedicionPerfilDerechoJulio2024 (1).m
Marcadores Utilizados¶
| Marcador | Descripción | Uso |
|---|---|---|
Tragus Der. / Lóbulo Oreja Der. |
Oreja derecha | Ubicación sagital cabeza |
Apex Cervical Der. |
Apex cervical | Lordosis cervical |
Punto Acromion Der. |
Hombro derecho | Alineación sagital hombro |
Punto Epicóndilo Der. |
Codo derecho | Ángulo de codo |
Base 3er Metacarpiano Der. |
Mano derecha | Ángulo de codo |
Trocánter Mayor (borde superior) Der. |
Cadera derecha | Traslación pélvica |
Tubérculo Ilíaco Der. |
Cresta ilíaca derecha | Traslación pélvica |
Tubérculo Cóndilo Externo Der. |
Rodilla derecha | Alineación sagital rodilla |
Borde anterior de Maléolo Der. |
Tobillo derecho | Ángulo tibiotarsiano |
Espina Ilíaca Anterosuperior |
EIAS | Basculación pélvica |
Espina Ilíaca Posteroinferior |
EIPI | Basculación pélvica |
Apex Lumbar Der. |
Apex lumbar | Lordosis lumbar |
Workflow - Vista Lateral Derecha¶
1. Configuración de Líneas de Referencia¶
Nota Importante: En perfil, la LRV pasa por el maleolo anterior
# La ReferenciasTag en perfil es especial:
Marcador: 'Borde anterior de Maléolo Der.'
XV = matXY(Maleolo, 1)
YV = matXY(Maleolo, 2)
# Click manual para horizontal (nivel del maleolo)
# Traza horizontal: (x1, y1) -> (x2, y2)
# Traza vertical automáticamente desde XV, y1
Vx1 = XV
Vy1 = y1
Vx2 = XV
Vy2 = y1 - (200/FC)
2. Tangentes Posturales¶
Botón: TagTangentes
Listbox: Seleccionar 'Punto Cabeza', 'Punto Dorsal' o 'Punto Sacro'
Acción: Para cada punto, click en el punto más posterior de la región
# Click en el punto más posterior de la región seleccionada
# El sistema traza una línea vertical tangente:
x1 = punto_clickeado_x
y1 = punto_clickeado_y
# Trazar línea vertical:
p1x = x1
p1y = y1 - (2 * 10/FC) # 20 cm arriba
p2x = x1
p2y = y1 + (10/FC) # 10 cm abajo
# Guardar coordenadas:
Si selección == 'Punto Cabeza':
Xcabeza = x1
Ycabeza = y1
Si selección == 'Punto Dorsal':
Xdorsal = x1
Ydorsal = y1
Si selección == 'Punto Sacro':
Xsacro = x1
Ysacro = y1
3. Región Cérvico-Cefálica¶
Botón: TagCervicoCefalica
Cálculos:
-
Ubicación Sagital de Cabeza (Distancia Tragus a LVR)
Marcador: 'Tragus Der.' (o 'Lóbulo Oreja Der.') XTRAGUS = matXY(Tragus, 1) DistanciaTragus = FC * (XTRAGUS - Vx1) Si DistanciaTragus > 1: diagnóstico = 'antepulsión' Si DistanciaTragus < -1: diagnóstico = 'retropulsión' Sino: diagnóstico = 'alineada' -
Tangentes Occipital-Dorso
# Requiere tangentes previamente trazadas DistanciaCabezaDorso = FC * (Xcabeza - Xdorsal) Si DistanciaCabezaDorso > 0: Si DistanciaCabezaDorso < 1: diagnóstico = 'Tangentes alineadas' Sino: diagnóstico = 'Tangentes NO alineadas, adelante' Sino: Si DistanciaCabezaDorso > -1: diagnóstico = 'Tangentes alineadas' Sino: diagnóstico = 'Tangentes NO alineadas, detrás' -
Lordosis Cervical (Distancia Apex Cervical a Tangente Dorsal)
Marcador: 'Apex Cervical Der.' XAPEXDORSO = matXY(ApexCervical, 1) DistanciaApexDorsal = FC * (XAPEXDORSO - Xdorsal) Si DistanciaApexDorsal > 3: Si DistanciaApexDorsal < 5: diagnóstico = 'Distancia al apex normal' Sino: diagnóstico = 'Distancia al apex aumentada' # Hiperlordosis Sino: diagnóstico = 'Distancia al apex disminuida' # Rectificación # Rango normal: 3-5 cm
Resultados Esperados:
Región: Cervico - Cefálica
Variables:
- Ubicación sagital de cabeza [cm]: DistanciaTragus
- Tangentes Occipital - Dorso [cm]: DistanciaCabezaDorso
- Lordosis cervical [cm]: DistanciaApexDorsal
4. Región Tronco-Columna¶
Botón: TagTroncoColumna
Cálculos:
-
Tangentes Dorso-Sacro
# Requiere tangentes previamente trazadas DistanciaSacroDorsal = FC * (Xdorsal - Xsacro) Si DistanciaSacroDorsal > 0: Si DistanciaSacroDorsal < 1: diagnóstico = 'Tangentes alineadas' Sino: diagnóstico = 'Tangentes NO alineadas, adelante' Sino: Si DistanciaSacroDorsal > -1: diagnóstico = 'Tangentes alineadas' Sino: diagnóstico = 'Tangentes NO alineadas, detrás' -
Lordosis Lumbar (Distancia Apex Lumbar a Tangente Sacro)
Marcador: 'Apex Lumbar Der.' XAPEXLUMBAR = matXY(ApexLumbar, 1) DistanciaApexSacro = FC * (XAPEXLUMBAR - Xsacro) Si DistanciaApexSacro > 3: Si DistanciaApexSacro < 5: diagnóstico = 'Distancia al apex normal' Sino: diagnóstico = 'Distancia al apex aumentada' # Hiperlordosis Sino: diagnóstico = 'Distancia al apex disminuida' # Rectificación # Rango normal: 3-5 cm
Resultados Esperados:
Región: Tronco - columna
Variables:
- Tangentes Dorso - Sacro [cm]: DistanciaSacroDorsal
- Lordosis lumbar [cm]: DistanciaApexSacro
5. Cintura Escapular - Miembro Superior¶
Botón: TagMiembroSuperior
Cálculos:
-
Alineación Sagital Hombro (Distancia Acromion a LVR)
Marcador: 'Punto Acromion Der.' XACROMION = matXY(Acromion, 1) DistanciaAcromionDer = FC * (XACROMION - Vx1) Si DistanciaAcromionDer > 1: diagnóstico = 'antepulsión' Si DistanciaAcromionDer < -1: diagnóstico = 'retropulsión' Sino: diagnóstico = 'Alineado' -
Ángulo de Codo
Marcadores: 'Punto Acromion Der.', 'Punto Epicóndilo Der.', 'Base 3er Metacarpiano Der.' XACROMION = matXY(Acromion, 1) YACROMION = matXY(Acromion, 2) XEPICONDILODER = matXY(Epicondilo, 1) YEPICONDILODER = matXY(Epicondilo, 2) XMETADER = matXY(Metacarpiano, 1) YMETADER = matXY(Metacarpiano, 2) A = [XACROMION - XEPICONDILODER, YACROMION - YEPICONDILODER] B = [XMETADER - XEPICONDILODER, YMETADER - YEPICONDILODER] angulocodo = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si angulocodo > 175 Y angulocodo < 180: diagnóstico = 'normal' Si angulocodo >= 180: diagnóstico = 'hiperextensión' Sino: diagnóstico = 'aumento de flexión'
Resultados Esperados:
Región: C. Escapular - M. Superior
Variables:
- Alineación sagital hombro [cm]: DistanciaAcromionDer
- Ángulo Codo [°]: angulocodo
6. Cintura Pélvica - Miembro Inferior¶
Botón: TagPelvisMiembroInferior
Cálculos:
-
Traslación Pélvica (Trocánter) (Distancia Trocánter a LVR)
Marcador: 'Trocánter Mayor (borde superior) Der.' XTROCANTER = matXY(Trocanter, 1) DistanciaTrocanterDer = FC * (XTROCANTER - Vx1) Si DistanciaTrocanterDer > 1: diagnóstico = 'antepulsión' Si DistanciaTrocanterDer < -1: diagnóstico = 'retropulsión' Sino: diagnóstico = 'neutro' -
Traslación Pélvica (Ilíaco) (Distancia Tubérculo Ilíaco a LVR)
Marcador: 'Tubérculo Ilíaco Der.' XTILIACO = matXY(TubIliaco, 1) DistTuberculoIliacoDer = FC * (XTILIACO - Vx1) Si DistTuberculoIliacoDer > 1: diagnóstico = 'antepulsión' Si DistTuberculoIliacoDer < -1: diagnóstico = 'retropulsión' Sino: diagnóstico = 'neutro' -
Alineación Sagital Rodilla (Distancia Cóndilo a LVR)
Marcador: 'Tubérculo Cóndilo Externo Der.' XCONDILO = matXY(Condilo, 1) DistanciaCondiloDer = FC * (XCONDILO - Vx1) Si DistanciaCondiloDer > 1: diagnóstico = 'Genu Flexo' Si DistanciaCondiloDer < -1: diagnóstico = 'Genu recurvatum' Sino: diagnóstico = 'Normal' -
Basculación Pélvica Sagital (Ángulo entre EIAS y EIPI)
Marcadores: 'Espina Ilíaca Anterosuperior', 'Espina Ilíaca Posteroinferior' XEIAS = matXY(EIAS, 1) YEIAS = matXY(EIAS, 2) XEIPI = matXY(EIPI, 1) YEIPI = matXY(EIPI, 2) Si YEIAS < YEIPI: # Abre hacia atrás A = [XEIPI - XEIAS, YEIAS - YEIAS] B = [XEIPI - XEIAS, YEIPI - YEIAS] InclinacionPelvisDer = -rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si InclinacionPelvisDer < -2: diagnóstico = 'Retroversión' Sino: diagnóstico = 'Normal' Sino: # Abre hacia adelante A = [XEIAS - XEIPI, YEIPI - YEIPI] B = [XEIAS - XEIPI, YEIAS - YEIPI] InclinacionPelvisDer = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si InclinacionPelvisDer > 2: diagnóstico = 'Anteversión' Sino: diagnóstico = 'Normal' -
Ángulo Tibiotarsiano
Marcadores: 'Borde anterior de Maléolo Der.', 'Tubérculo Cóndilo Externo Der.' XMALEOLODER = matXY(Maleolo, 1) YMALEOLODER = matXY(Maleolo, 2) XTUBERDER = matXY(Tuberculo, 1) YTUBERDER = matXY(Tuberculo, 2) # Punto de referencia horizontal: XPUNTO = Hx2 YPUNTO = YMALEOLODER # Trazar líneas (amarillo): # Línea 1: Maleolo -> Tubérculo # Línea 2: Maleolo -> Punto horizontal A = [XTUBERDER - XMALEOLODER, YTUBERDER - YMALEOLODER] B = [XPUNTO - XMALEOLODER, YPUNTO - YMALEOLODER] angulotibioDer = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si angulotibioDer > 92: diagnóstico = 'Tobillo en extensión' Si angulotibioDer < 88: diagnóstico = 'Tobillo en flexión' Sino: diagnóstico = 'Tobillo normal' # Normal: 90° ± 2° -
Ángulo de Rodilla (Requiere trocánter visible)
Marcadores: 'Trocánter Mayor (borde superior) Der.', 'Tubérculo Cóndilo Externo Der.', 'Borde anterior de Maléolo Der.' # Trazar líneas (amarillo): # Línea 1: Cóndilo -> Maleolo # Línea 2: Cóndilo -> Trocánter A = [XTROCANTER - XCONDILO, YTROCANTER - YCONDILO] B = [XMALEOLODER - XCONDILO, YMALEOLODER - YCONDILO] anguloRodillaDer = rad2deg(acos(dot(A,B) / (norm(A)*norm(B)))) Si anguloRodillaDer < 178: Si XTROCANTER > XCONDILO: anguloRodillaDer = -anguloRodillaDer diagnóstico = 'Genu Recurvatum' Sino: diagnóstico = 'Genu Flexo' Sino: diagnóstico = 'Neutro' # Normal: 180° (alineación)
Resultados Esperados:
Región: C. Pélvica - M. Inferior
Variables:
- Traslación pélvica (Ilíaco) [cm]: DistTuberculoIliacoDer
- Traslación pélvica (Trocánter) [cm]: DistanciaTrocanterDer
- Basculación pélvica sagital [°]: InclinacionPelvisDer
- Alineación sagital rodilla [cm]: DistanciaCondiloDer
- Ángulo tibio tarsiano [°]: angulotibioDer
- Ángulo de rodilla [°]: anguloRodillaDer
Vista Lateral Izquierda (Perfil Izquierda)¶
Archivo MATLAB¶
InterfazMedicionPerfilIzquierdoJulio2024 (1).m
Marcadores Utilizados¶
Similar a Perfil Derecho, pero con marcadores del lado izquierdo:
- Tragus Izq. / Lóbulo Oreja Izq.
- Apex Cervical Izq.
- Punto Acromion Izq.
- Punto Epicóndilo Izq.
- Base 3er Metacarpiano Izq.
- Trocánter Mayor (borde superior) Izq.
- Tubérculo Ilíaco Izq.
- Tubérculo Cóndilo Externo Izq.
- Borde anterior de Maléolo Izq.
- Espina Ilíaca Anterosuperior Izq.
- Espina Ilíaca Posteroinferior Izq.
- Apex Lumbar Izq.
Workflow - Vista Lateral Izquierda¶
Nota: El workflow es idéntico al Perfil Derecho, pero:
1. La LRV pasa por el Borde anterior de Maléolo Izq.
2. Las distancias se calculan como: FC * (Vx1 - X_punto) en lugar de FC * (X_punto - Vx1)
3. Los diagnósticos de antepulsión/retropulsión se invierten debido a la orientación de la foto
Diferencias clave en cálculos:¶
# Perfil Derecho:
DistanciaTragus = FC * (XTRAGUS - Vx1)
Si DistanciaTragus > 1: diagnóstico = 'antepulsión'
Si DistanciaTragus < -1: diagnóstico = 'retropulsión'
# Perfil Izquierdo:
DistanciaTragus = FC * (Vx1 - XTRAGUS)
Si DistanciaTragus > 1: diagnóstico = 'antepulsión'
Si DistanciaTragus < -1: diagnóstico = 'retropulsión'
Resultados Esperados: Iguales al Perfil Derecho, pero con sufijo "Izq" en variables.
Valores de Referencia Diagnóstica¶
Umbrales de Rotación/Traslación¶
| Medición | Normal | Derecha/Antepulsión | Izquierda/Retropulsión |
|---|---|---|---|
| Distancia a LVR | -1 cm ≤ d ≤ 1 cm | d > 1 cm | d < -1 cm |
Umbrales de Inclinación¶
| Medición | Neutro | Derecha | Izquierda |
|---|---|---|---|
| Ángulo cabeza/hombros/pelvis | abs(θ) ≤ 2° | θ > 2° | θ < -2° |
Ángulo Q¶
| Rango | Diagnóstico |
|---|---|
| θ < 6° | Disminuido |
| 6° ≤ θ < 27° | Normal |
| θ ≥ 27° | Aumentado |
Ángulo de Codo¶
| Rango | Diagnóstico |
|---|---|
| θ < 175° | Aumento de flexión |
| 175° ≤ θ < 180° | Normal |
| θ ≥ 180° | Hiperextensión |
Lordosis Cervical y Lumbar (Distancia Apex)¶
| Rango | Diagnóstico |
|---|---|
| d < 3 cm | Rectificación |
| 3 cm ≤ d ≤ 5 cm | Normal |
| d > 5 cm | Hiperlordosis |
Ángulo Tibiotarsiano¶
| Rango | Diagnóstico |
|---|---|
| θ < 88° | Tobillo en flexión |
| 88° ≤ θ ≤ 92° | Normal |
| θ > 92° | Tobillo en extensión |
Ángulo de Rodilla¶
| Rango | Diagnóstico |
|---|---|
| θ < 178° y Xtrocanter > Xcondilo | Genu Recurvatum (negativo) |
| θ < 178° y Xtrocanter < Xcondilo | Genu Flexo (positivo) |
| θ ≥ 178° | Neutro |
Ángulo Calcáneo¶
| Condición | Diagnóstico |
|---|---|
| θ > 178° | Neutro |
| θ ≤ 178° y abre hacia medial | Calcáneo varo (supinado) |
| θ ≤ 178° y abre hacia lateral | Calcáneo valgo (pronado) |
Genu Varo/Valgo¶
Si DistanciaMaleolos < 1 cm:
Si DistanciaCondilos < 1 cm: Neutro
Sino: Genu Varo
Sino:
Si DistanciaMaleolos > DistanciaCondilos: Genu Valgo
Sino: Genu Varo
Asimetría Escapular¶
| Diferencia | Diagnóstico |
|---|---|
| abs(Izq - Der) ≤ 1 cm | Simétrico |
| abs(Izq - Der) > 1 cm | Asimétrico |
Estructura de Archivos .mat¶
Contenido del archivo Marcadores_ID_ML_*.mat¶
Variables:
- cell_res: Cell array Nx4
Estructura de cada fila:
[1] Nombre del marcador (string)
[2] ? (dato adicional)
[3] Coordenada X (double)
[4] Coordenada Y (double)
- ID: Identificador del sujeto (cell array)
Identificación de Vista por Nombre de Archivo¶
Marcadores_ID_ML_13-2-2025_13-50-55.mat -> Vista: A (Anterior)
Marcadores_ID_ML_13-2-2025_13-56-2.mat -> Vista: P (Posterior)
Marcadores_ID_ML_13-2-2025_14-0-12.mat -> Vista: LD (Lateral Derecha)
Marcadores_ID_Ml_13-2-2025_14-3-33.mat -> Vista: LI (Lateral Izquierda)
Lectura de Coordenadas en Python¶
import scipy.io
# Cargar archivo
data = scipy.io.loadmat('Marcadores_ID_ML_*.mat')
# Extraer información
cell_res = data['cell_res']
ID = data['ID']
# Procesar cada marcador
for i in range(cell_res.shape[0]):
row = cell_res[i, 0]
nombre = str(row[0][0])
x = float(row[2][0, 0])
y = float(row[3][0, 0])
print(f"{nombre}: ({x:.2f}, {y:.2f})")
Ejemplo de Coordenadas Esperadas (valores aproximados)¶
Vista Anterior (píxeles para imagen ~2000x3000):
Tragus Der.: (850, 400)
Tragus Izq.: (1150, 400)
Escotadura Esternal: (1000, 900)
Apéndice Xifoides: (1000, 1100)
Punto Sínfisis Pubiana: (1000, 1600)
Espina Iliaca Anterosuperior Der.: (900, 1550)
Espina Iliaca Anterosuperior Izq.: (1100, 1550)
Vista Perfil (píxeles para imagen ~2000x3000):
Tragus Der.: (600, 400)
Apex Cervical Der.: (520, 600)
Punto Acromion Der.: (550, 850)
Trocánter Mayor Der.: (580, 1450)
Tubérculo Cóndilo Externo Der.: (595, 1950)
Borde anterior de Maléolo Der.: (600, 2600)
Notas de Implementación para Testing¶
Secuencia de Prueba Completa¶
def test_vista_anterior():
# 1. Cargar imagen
load_image("vista_anterior.jpg")
# 2. Calibrar
calibrate(point1=(100, 500), point2=(200, 500))
assert FC == pytest.approx(0.1, rel=0.01)
# 3. Importar marcadores
import_markers("Marcadores_ID_ML_13-2-2025_13-50-55.mat")
# 4. Trazar rectas de referencia
draw_reference_lines(
maleolo_der=(850, 2600),
maleolo_izq=(1150, 2600)
)
# 5. Región Cérvico-Cefálica
result = analyze_cervico_cefalica()
assert result['gradosCC'] == pytest.approx(expected_angle, abs=0.5)
assert result['diag_inclinacion_cabeza'] == expected_diagnosis
# 6. Región Tronco-Columna
result = analyze_tronco_columna()
assert result['gradosTronco'] == pytest.approx(expected_angle, abs=0.5)
# 7. Cintura Escapular
result = analyze_hombros()
assert result['gradosHombros'] == pytest.approx(expected_angle, abs=0.5)
# 8. Cintura Pélvica
result = analyze_pelvis_miembro_inferior()
assert result['anguloQDerecho'] == pytest.approx(expected_angle, abs=1.0)
assert result['diag_miembro_inferior'] == expected_diagnosis
# 9. Exportar resultados
export_results("DatosSujetoML.xlsx")
Coordinación de Vistas¶
Cada vista debe probarse independientemente, pero el ID del sujeto debe ser consistente:
def test_all_views():
subject_id = "ML"
# Vista Anterior (sheet 1)
test_vista_anterior(subject_id)
# Vista Posterior (sheet 2)
test_vista_posterior(subject_id)
# Vista Perfil Derecho (sheet 3)
test_vista_perfil_derecho(subject_id)
# Vista Perfil Izquierdo (sheet 4)
test_vista_perfil_izquierdo(subject_id)
# Verificar archivo Excel completo
workbook = load_workbook(f"DatosSujeto{subject_id}.xlsx")
assert len(workbook.sheetnames) == 4
Casos de Prueba Específicos¶
Caso 1: Sujeto con Postura Neutra¶
@pytest.mark.parametrize("vista,expected", [
("anterior", {
"gradosCC": 0.5,
"diag_inclinacion_cabeza": "neutro",
"gradosTronco": 1.0,
"diag_inclinacion_tronco": "neutro",
"gradosHombros": 0.8,
"diag_inclinacion_hombros": "neutro",
"gradosPMI": 0.7,
"diag_inclinacion_pelvis": "neutro",
"anguloQDerecho": 15.0,
"diag_angulo_Qderecho": "normal",
"anguloQIzquierdo": 15.5,
"diag_angulo_Qizquierdo": "normal",
"diag_miembro_inferior": "Neutro"
})
])
def test_postura_neutra(vista, expected):
# Implementar prueba con valores esperados
pass
Caso 2: Sujeto con Escoliosis (Desbalance Coronal)¶
def test_escoliosis():
# Vista Posterior
result = analyze_tronco_columna()
assert result['Dist_C7'] > 1.0 # Desviación a la derecha
assert result['Diag_C7'] == 'Derecha'
assert result['Dist_T3'] > 1.0
assert result['Diag_T3'] == 'Derecha'
# etc.
Caso 3: Sujeto con Genu Valgo¶
def test_genu_valgo():
result = analyze_pelvis_miembro_inferior()
assert result['DistanciaMaleolos'] > result['DistanciaCondilos']
assert result['diag_miembro_inferior'] == 'Genu Valgo'
Fin del Documento
Este documento debe ser actualizado con cada nuevo marcador, cálculo o diagnóstico agregado al sistema.