Saltar a contenido

Marcadores Mínimos por Variable - EPPA

Versión: 1.0 Fecha: 2025-12-30 Propósito: Referencia rápida de qué marcadores son necesarios para calcular cada variable


🎯 Objetivo de Este Documento

Este documento responde a la pregunta: "¿Qué marcadores mínimos necesito para calcular la variable X?"

Casos de uso: - ✅ Evaluación parcial (ej: solo rodillas, solo hombros) - ✅ Exoesqueletos (no se pueden marcar todos los puntos) - ✅ Pacientes con ropa/vendajes que cubren zonas - ✅ Investigación enfocada en una región específica

⚠️ IMPORTANTE: Si falta un marcador requerido, la variable aparecerá como "Punto no visible" y NO se calculará.


📐 Marcadores Universales (Todas las Vistas)

Estos marcadores son OBLIGATORIOS para todas las vistas:

Marcador Propósito Notas
Punto de Calibración 1 Calcular Factor de Calibración (FC) Separados exactamente 10 cm
Punto de Calibración 2 Calcular Factor de Calibración (FC) Separados exactamente 10 cm
Línea Vertical de Referencia (LVR) Referencia para distancias horizontales Coordenada X en píxeles

Cálculo del FC:

D12 = distancia_euclidiana(punto_cal_1, punto_cal_2)  # en píxeles
FC = 10.0 / D12  # cm por píxel

⚠️ SIN ESTOS 3, NINGUNA VARIABLE SE PUEDE CALCULAR


👁️ VISTA ANTERIOR (Frente)

Región: Cérvico-Cefálica

# Variable Marcadores Mínimos Opcional Fórmula
1 Ángulo de Inclinación Cabeza • Tragus Izquierdo
• Tragus Derecho
- angle(tragus_izq, tragus_der)
2 Rotación Eminencia Frontal Media • Eminencia Frontal Media
• LVR
• FC
- FC × (X_efm - LVR)
3 Rotación Espina Nasal • Espina Nasal
• LVR
• FC
- FC × (X_espina - LVR)
4 Rotación Punto Mentoniano • Punto Mentoniano
• LVR
• FC
- FC × (X_menton - LVR)

Región: Tronco - Columna

# Variable Marcadores Mínimos Opcional Fórmula
5 Rotación Escotadura Esternal • Escotadura Esternal
• LVR
• FC
- FC × (X_escot - LVR)
6 Rotación Apéndice Xifoides • Apéndice Xifoides
• LVR
• FC
- FC × (X_xifoid - LVR)
7 Rotación Sínfisis Pubiana • Sínfisis Pubiana
• LVR
• FC
- FC × (X_sinfis - LVR)
8 Ángulo de Inclinación Tronco • Sínfisis Pubiana
• Escotadura Esternal
- angle_vertical(sinfisis, escotadura)

Región: Cintura Escapular - Miembro Superior

# Variable Marcadores Mínimos Opcional Fórmula
9 Ángulo de Inclinación Hombros • Acromion Izquierdo
• Acromion Derecho
- angle(acromion_izq, acromion_der)

Región: Cintura Pélvica - Miembro Inferior

# Variable Marcadores Mínimos Opcional Fórmula
10 Ángulo de Inclinación Pelvis • EIAS Izquierda
• EIAS Derecha
- angle(eias_izq, eias_der)
11 Ángulo Q Derecho • EIAS Derecha
• Centro Rótula Derecha
• TAT Derecha
- angle_q(tat, rotula, eias)
12 Ángulo Q Izquierdo • EIAS Izquierda
• Centro Rótula Izquierda
• TAT Izquierda
- angle_q(tat, rotula, eias)

Total marcadores Vista Anterior: 17 marcadores + 2 calibración + LVR = 20 puntos


👁️ VISTA POSTERIOR (Espalda)

Región: Cérvico-Cefálica

# Variable Marcadores Mínimos Opcional Fórmula
1 Ángulo de Inclinación Cabeza • Lóbulo Oreja Izquierda
• Lóbulo Oreja Derecha
- angle(lobulo_izq, lobulo_der)

Región: Tronco - Columna

# Variable Marcadores Mínimos Opcional Fórmula
2 Desbalance Coronal C7 • C7
• LVR
• FC
- FC × (X_c7 - LVR)
3 Desbalance Coronal T3 • T3
• LVR
• FC
- FC × (X_t3 - LVR)
4 Desbalance Coronal T7 • T7
• LVR
• FC
- FC × (X_t7 - LVR)
5 Desbalance Coronal T12 • T12
• LVR
• FC
- FC × (X_t12 - LVR)
6 Desbalance Coronal L5 • L5
• LVR
• FC
- FC × (X_l5 - LVR)
7 Punto Interno Espina Omóplato Izq • Espina Omóplato Izq
• LVR
• FC
- FC × (X_espina - LVR)
8 Punto Ángulo Inferior Omóplato Izq • Ángulo Inf Omóplato Izq
• LVR
• FC
- FC × (X_angulo - LVR)
9 Punto Interno Espina Omóplato Der • Espina Omóplato Der
• LVR
• FC
- FC × (X_espina - LVR)
10 Punto Ángulo Inferior Omóplato Der • Ángulo Inf Omóplato Der
• LVR
• FC
- FC × (X_angulo - LVR)

Región: Cintura Pélvica

# Variable Marcadores Mínimos Opcional Fórmula
11 Ángulo de Inclinación Pelvis • EIPS Izquierda
• EIPS Derecha
- angle(eips_izq, eips_der)

Región: Miembro Inferior

# Variable Marcadores Mínimos Opcional Fórmula
12 Ángulo Calcáneo Izquierdo • Tendón Aquiles Izq
• Calcáneo Izq
• Punto Medio Pliegue Poplíteo Izq
Auto-estimable angle(aquiles, calcaneo, popliteo)
13 Ángulo Calcáneo Derecho • Tendón Aquiles Der
• Calcáneo Der
• Punto Medio Pliegue Poplíteo Der
Auto-estimable angle(aquiles, calcaneo, popliteo)

⚡ OPTIMIZACIÓN: Los puntos poplíteos se pueden auto-estimar si solo se marca Aquiles + Calcáneo.

Total marcadores Vista Posterior: 16 marcadores + 2 calibración + LVR = 19 puntos


👁️ VISTA LATERAL (Perfil Derecho)

Región: Cérvico-Cefálica

# Variable Marcadores Mínimos Opcional Fórmula Código MATLAB
1 🔴 Ubicación Sagital de Cabeza Tragus
LVR
FC
- FC × (X_tragus - LVR) Línea 446
2 Tangentes Occipital - Dorso • Occipital
• Tangente Dorso
• FC
- FC × (X_occipital - X_dorso) Línea 483
3 Lordosis Cervical • C7
• Tangente Dorso
• FC
- FC × (X_c7 - X_dorso) Línea 508

Región: Tronco - Columna

# Variable Marcadores Mínimos Opcional Fórmula Código MATLAB
4 Tangentes Dorso - Sacro • Tangente Dorso
Punto Sacro
• FC
- FC × (X_dorso - X_sacro) Línea 637
5 Lordosis Lumbar • Apex Lumbar
Punto Sacro
• FC
- FC × (X_apex - X_sacro) Línea 672

Región: Cintura Escapular

# Variable Marcadores Mínimos Opcional Fórmula Código MATLAB
6 Alineación Sagital Hombro • Acromion
• LVR
• FC
- FC × (X_acromion - LVR) Línea 970

Región: Miembro Superior

# Variable Marcadores Mínimos Opcional Fórmula Código MATLAB
7 Ángulo de Codo • Acromion
• Epicóndilo
• Base 3er Metacarpiano
- angle(acromion, epicondilo, meta) Líneas 1034-1037

Región: Cintura Pélvica

# Variable Marcadores Mínimos Opcional Fórmula Código MATLAB
8 Traslación Pélvica (Ilíaco) • Tubérculo Ilíaco
• LVR
• FC
- FC × (X_iliaco - LVR) Línea 1151
9 Traslación Pélvica (Trocánter) • Trocánter Mayor
• LVR
• FC
- FC × (X_trocanter - LVR) Línea 1106
10 Basculación Pélvica Sagital • Tubérculo Ilíaco
• Trocánter Mayor
- angle(tuberculo, trocanter) Líneas 1333-1357

Región: Miembro Inferior

# Variable Marcadores Mínimos Opcional Fórmula Código MATLAB
11 Ángulo de Rodilla • Trocánter Mayor
• Tubérculo Cóndilo Externo
• Borde Anterior Maléolo
- angle(trocanter, condilo, maleolo) Líneas 1384-1414
12 Ángulo Tibiotarsiano • Tubérculo Cóndilo Externo
• Borde Anterior Maléolo
• Base 5to Metatarsiano
- angle(condilo, maleolo, metatarsiano) Líneas 1474-1514

Total marcadores Vista Lateral: 13 marcadores + 2 calibración + LVR = 16 puntos


👁️ VISTA LATERAL (Perfil Izquierdo)

Las variables y marcadores son IDÉNTICOS a Perfil Derecho, solo que medidos del lado izquierdo.

NOTA: Algunos ángulos pueden tener signos opuestos debido a la orientación de la imagen.


🔴 CASO PROBLEMA: Ubicación Sagital de Cabeza

El Problema Reportado

Situación: En evaluación de exoesqueleto (perfil izquierdo), se marcaban: - ✅ Tragus (oreja) - ✅ LVR (línea vertical de referencia)

Resultado: ❌ "Ubicación Sagital de Cabeza" no aparecía

Causa Raíz

La variable "Ubicación Sagital de Cabeza" se calcula como:

% Línea 446 de InterfazMedicionPerfilDerechoJulio2024.m
DistanciaTragus = handles.FC * (XTRAGUS - handles.Vx1);

Donde: - FC = Factor de Calibración = 10 / D12 - XTRAGUS = Coordenada X del Tragus - Vx1 = Línea Vertical de Referencia (LVR)

Por Qué No Funcionaba

Marcadores presentes: - ✅ Tragus → XTRAGUS disponible - ✅ LVR → Vx1 disponible

Marcadores FALTANTES: - ❌ Punto de Calibración 1D12 = 0 - ❌ Punto de Calibración 2D12 = 0

Resultado:

FC = 10 / 0  # ¡Error! División por cero
# O bien: FC queda en valor por defecto = 0
DistanciaTragus = 0 * (X_tragus - LVR) = 0

Solución

Para calcular "Ubicación Sagital de Cabeza" se necesitan:

  1. Tragus (el marcador de la oreja)
  2. LVR (línea vertical de referencia)
  3. FC (factor de calibración) → REQUIERE 2 puntos de calibración separados 10 cm

Marcadores mínimos totales:

• Tragus
• LVR
• Punto Calibración 1
• Punto Calibración 2 (separado 10 cm del punto 1)

Total: 4 elementos (2 marcadores + 2 calibración)

Verificación en Código

MATLAB (líneas 439-449):

if (TRAGUSDER ~= 0)
    XTRAGUS = handles.matXY(TRAGUSDER,1);
    YTRAGUS = handles.matXY(TRAGUSDER,2);

    % Validación del Factor de Calibración
    if handles.FC > 0
        DistanciaTragus = handles.FC * (XTRAGUS - handles.Vx1);
        handles.DistanciaTragus = DistanciaTragus;
    else
        handles.DistanciaTragus = 000;  % ← "Punto no visible"
    end
end

⚠️ Si FC = 0, el resultado es 000 = "Punto no visible"


🔴 CASO PROBLEMA 2: Lordosis Lumbar (Error x10)

El Problema de los "Datos Locos"

Situación: Evaluadores 4 y 8 obtuvieron lordosis lumbar de 51 cm (debería ser ~5 cm)

Variable afectada:

% Línea 672
DistanciaApexSacro = handles.FC * (XAPEXLUMBAR - handles.Xsacro);

Causa Raíz

Marcadores esperados: - ✅ Apex Lumbar → XAPEXLUMBAR disponible - ❌ "Punto Sacro" (nombre EXACTO requerido)

Marcadores usados por los evaluadores: - ❌ "Espina Ilíaca Posterosuperior" - ❌ "Espina Ilíaca Posteroinferior"

Resultado:

% Código MATLAB espera exactamente "Punto Sacro"
switch handles.lista
    case 'Punto Sacro'
        handles.Xsacro = x1;  % Solo se asigna si el nombre es EXACTO
end

% Si el nombre no coincide:
handles.Xsacro = 0  % ← Queda en cero!

% Entonces:
DistanciaApexSacro = FC * (XAPEXLUMBAR - 0)
DistanciaApexSacro = FC * XAPEXLUMBAR  % ← Valor inflado x10!

Solución

Marcadores requeridos para Lordosis Lumbar:

• Apex Lumbar
• "Punto Sacro" (NOMBRE EXACTO, case-sensitive)
• FC

⚠️ NOMBRES DEBEN SER EXACTOS - MATLAB usa switch case estricto


📊 Tabla Resumen: Evaluaciones Parciales

Caso de Uso 1: Solo Rodillas

Vista: Anterior Variables: Ángulo Q Derecho e Izquierdo

Marcadores mínimos:

✅ EIAS Izquierda
✅ EIAS Derecha
✅ Centro Rótula Izquierda
✅ Centro Rótula Derecha
✅ TAT Izquierda
✅ TAT Derecha
✅ Punto Calibración 1
✅ Punto Calibración 2
✅ LVR

Total: 9 puntos (6 marcadores + 2 calibración + LVR)

Caso de Uso 2: Solo Posición de Cabeza (Perfil)

Vista: Lateral Derecha Variable: Ubicación Sagital de Cabeza

Marcadores mínimos:

✅ Tragus
✅ Punto Calibración 1
✅ Punto Calibración 2
✅ LVR

Total: 4 puntos

⚠️ ADVERTENCIA: Sin los puntos de calibración, FC = 0 y la variable aparecerá como "Punto no visible"

Caso de Uso 3: Evaluación de Columna (Posterior)

Vista: Posterior Variables: Desbalance coronal C7, T3, T7, T12, L5

Marcadores mínimos:

✅ C7
✅ T3
✅ T7
✅ T12
✅ L5
✅ Punto Calibración 1
✅ Punto Calibración 2
✅ LVR

Total: 8 puntos (5 vértebras + 2 calibración + LVR)

Caso de Uso 4: Solo Hombros (Anterior)

Vista: Anterior Variable: Ángulo de Inclinación Hombros

Marcadores mínimos:

✅ Acromion Izquierdo
✅ Acromion Derecho
✅ Punto Calibración 1
✅ Punto Calibración 2
✅ LVR (no estrictamente necesario para ángulos)

Total: 4-5 puntos

💡 NOTA: Para variables de ángulo (no distancias), la LVR NO es necesaria. Solo se necesita FC si el ángulo usa distancias.


⚠️ Reglas Críticas de Validación

1. Marcador Faltante → "Punto No Visible"

MATLAB (ejemplo línea 426-430):

if (TRAGUSDER == 0)
    % No se encontró el marcador
    handles.DistanciaTragus = 000;  % "Punto no visible"
end

Python (debería hacer):

if tragus is None or fc == 0:
    return {
        "value": None,
        "diagnosis": "Punto no visible",
        "error": "Marcador faltante o FC=0"
    }

2. Nombres de Marcadores DEBEN Ser Exactos

MATLAB usa switch case estricto:

switch handles.lista
    case 'Punto Sacro'          % ← EXACTO
        handles.Xsacro = x1;
    case 'Apex Lumbar'          % ← EXACTO
        XAPEXLUMBAR = x1;
end

Si el nombre no coincide: Variable queda en 0 → Cálculos incorrectos

Solución: Usar los nombres EXACTOS definidos en marker-definitions.ts

3. Factor de Calibración (FC) es OBLIGATORIO

Para TODAS las variables de distancia (cm), se requiere FC > 0.

Cálculo del FC:

D12 = sqrt((x2-x1)² + (y2-y1)²)  # Distancia entre puntos de calibración
FC = 10.0 / D12  # cm/pixel

Sin FC válido (FC = 0): - ❌ Todas las distancias = 0 - ❌ Aparece como "Punto no visible"


🎓 Ejemplo Completo: Evaluación Solo de Rodillas

Objetivo

Medir solo Ángulo Q (rodillas) sin marcar todo el cuerpo.

Paso 1: Preparar imagen

  • Foto del paciente de frente (vista anterior)
  • Importante: Incluir regla o patrón de calibración de 10 cm

Paso 2: Marcar puntos de calibración

1. Punto Calibración 1: (x1, y1) ← Inicio de regla 10 cm
2. Punto Calibración 2: (x2, y2) ← Fin de regla 10 cm

Paso 3: Marcar línea vertical de referencia

3. LVR: Click en punto vertical de referencia (ej: línea en fondo)

Paso 4: Marcar puntos de rodillas

4. EIAS Izquierda
5. EIAS Derecha
6. Centro Rótula Izquierda
7. Centro Rótula Derecha
8. TAT Izquierda (Tuberosidad Anterior Tibia)
9. TAT Derecha

Paso 5: Calcular

✅ Ángulo Q Izquierdo  = calculado
✅ Ángulo Q Derecho    = calculado
❌ Otras variables     = "Punto no visible"

Total marcadores: 9 puntos (en lugar de 20 para vista anterior completa)


🛡️ Validación de Marcadores en Código

Verificación Actual en Python

# api.py, línea ~700
def _get_point(self, key: str) -> Tuple[float, float]:
    """Extract point from markers dict"""
    if key not in self.markers:
        raise ValueError(f"Missing required marker: {key}")  # ← CORRECTO ✅
    # ...

Estado: ✅ YA VALIDA que el marcador existe

Verificación Recomendada para FC

def calculate_distance_variable(marker_x, lrv_x, fc):
    """
    Calcula variable de distancia con validación
    """
    # VALIDAR: FC debe ser > 0
    if fc <= 0:
        return {
            "value": None,
            "diagnosis": "Punto no visible",
            "error": "Factor de calibración inválido (FC=0). Marque puntos de calibración."
        }

    # VALIDAR: Marcador debe existir
    if marker_x is None:
        return {
            "value": None,
            "diagnosis": "Punto no visible",
            "error": "Marcador faltante"
        }

    # Calcular
    distance = fc * (marker_x - lrv_x)
    return {
        "value": distance,
        "diagnosis": diagnose(distance),
        "error": None
    }

Acción requerida: Agregar esta validación a TODAS las funciones de cálculo.


📋 Checklist de Implementación

Para Desarrolladores

Cuando agregues una nueva variable, asegúrate de:

  • [ ] Documentar marcadores mínimos en esta tabla
  • [ ] Validar que marcadores existen antes de calcular
  • [ ] Validar que FC > 0 para variables de distancia
  • [ ] Retornar "Punto no visible" si falta algún marcador
  • [ ] Retornar mensaje claro de qué falta (ej: "Falta Punto Sacro")
  • [ ] Agregar test con marcador faltante
  • [ ] Agregar test con FC = 0

Para Usuarios

Antes de intentar calcular una variable:

  • [ ] Verificar marcadores requeridos en esta tabla
  • [ ] Marcar primero los puntos de calibración (SIEMPRE)
  • [ ] Marcar la LVR
  • [ ] Marcar los marcadores específicos de la variable
  • [ ] Usar nombres EXACTOS de marcadores (case-sensitive en MATLAB)

🔧 Mejoras Propuestas

1. Validación Preventiva en Frontend

// Antes de permitir "Calcular"
function validateRequiredMarkers(view: string, variables: string[]): ValidationResult {
  const missingMarkers = [];

  // Siempre requeridos
  if (!hasCalibrationPoints()) {
    missingMarkers.push("Puntos de Calibración (2)");
  }
  if (!hasLVR()) {
    missingMarkers.push("Línea Vertical de Referencia");
  }

  // Por variable
  for (const variable of variables) {
    const required = MARCADORES_POR_VARIABLE[view][variable];
    for (const marker of required) {
      if (!hasMarker(marker)) {
        missingMarkers.push(`${marker} (para ${variable})`);
      }
    }
  }

  return {
    valid: missingMarkers.length === 0,
    missing: missingMarkers
  };
}

2. Mensajes Claros al Usuario

// En lugar de:
 "Punto no visible"

// Mostrar:
 "No se puede calcular 'Ubicación Sagital de Cabeza'"
   "Marcadores faltantes:"
   "  • Punto de Calibración 1"
   "  • Punto de Calibración 2"
   "Por favor marque ambos puntos separados exactamente 10 cm"

3. Sugerencias de Evaluación Parcial

// Botón en UI: "Evaluar Solo Rodillas"
// Auto-selecciona en la tabla:
const marcadoresMinimosRodillas = [
  "EIAS Izquierda",
  "EIAS Derecha",
  "Centro Rótula Izquierda",
  "Centro Rótula Derecha",
  "TAT Izquierda",
  "TAT Derecha",
  "Punto Calibración 1",
  "Punto Calibración 2",
  "LVR"
];

// Y oculta los demás marcadores de la lista

📖 Referencias Rápidas

Archivo → Variable → Marcadores

calculations.py (Vista Anterior):

angle_with_horizontal()        Tragus Izq + Tragus Der
horizontal_distance_cm()       Marcador + LVR + FC
trunk_angle()                  Sínfisis Pubiana + Escotadura Esternal
pelvis_angle()                 EIAS Izq + EIAS Der
q_angle()                      TAT + Centro Rótula + EIAS

calculations_lateral.py (Vista Perfil):

head_angle_horizontal()        Tragus + Apex Cervical
trunk_angle_vertical()         Apex Cervical + Apex Lumbar
elbow_angle()                  Acromion + Epicóndilo + Metacarpiano
knee_angle()                   Trocánter + Cóndilo + Maléolo

calculations_posterior.py (Vista Posterior):

calcaneo_angle_left()          Aquiles Izq + Calcáneo Izq + Poplíteo Izq
calcaneo_angle_right()         Aquiles Der + Calcáneo Der + Poplíteo Der
coronal_balance_c7()           C7 + LVR + FC
coronal_balance_t7()           T7 + LVR + FC
coronal_balance_l5()           L5 + LVR + FC
pelvis_angle_posterior()       EIPS Izq + EIPS Der
head_angle_posterior()         Lóbulo Izq + Lóbulo Der


🎯 Resumen Ejecutivo

Vista Variables Totales Marcadores Mínimos (completo) Marcadores para 1 variable (mínimo)
Anterior 15 variables 20 puntos 4-6 puntos (depende de variable)
Posterior 16 variables 19 puntos 4-6 puntos
Perfil Derecho 13 variables 16 puntos 4-5 puntos
Perfil Izquierdo 13 variables 16 puntos 4-5 puntos

Regla de oro: Puntos de Calibración + LVR son OBLIGATORIOS para TODAS las evaluaciones (incluso parciales).


✅ Acción Requerida

  1. Documentar marcadores mínimos (este documento)
  2. Validar en código que marcadores existen antes de calcular
  3. Mensajes claros cuando faltan marcadores
  4. Tests con marcadores faltantes
  5. UI helpers para evaluaciones parciales (botones: "Solo Rodillas", "Solo Columna", etc.)

Última actualización: 2025-12-30 Mantenedor: Luis Arancibia Fuente: Análisis de código MATLAB + Python + casos reales Dra. Oleari