📐 Versão com fórmulas matemáticas: https://fzampirolli.github.io/pdi-vc/eps/py.pt/EP01_01.html
(Fórmulas renderizadas pelo MathJax — abrir em nova aba)

EP01_01 📏 Três métricas de distância em PDI

Nesta atividade, você deve escrever um programa que calcule as três distâncias clássicas em PDI: Euclidiana (L2), City‑Block (L1) e Chessboard (L∞).

  • Leia 4 números reais que representam as coordenadas: A_x, A_y, B_x, B_y.
  • Calcule as três distâncias utilizando as fórmulas:
  • d_Euclidiana = √((B_x - A_x)^2 + (B_y - A_y)^2)

    d_City-block = |B_x - A_x| + |B_y - A_y|

    d_Chessboard = \max\big(|B_x - A_x|,\; |B_y - A_y|\big)

  • Imprima os três resultados, cada um em uma linha, formatados com duas casas decimais, na ordem: Euclidiana, City‑block, Chessboard.
  • 📌 Importante:

  • Utilize as funções matemáticas padrão da sua linguagem: math.sqrt, abs (ou fabs) e max.
  • A saída deve conter apenas os números (um por linha), sem textos adicionais.
  • Ver um simulador interativo para esta questão na Figura 1.12 (gráfico com arrasto dos pontos e visualização das três métricas).
  • 🖼️ Por que isso importa? – Custo computacional

    Em uma imagem 1000×1000 pixels (1 milhão de pixels), calcular a distância de cada pixel a um ponto de referência exige 1 milhão de operações. A escolha da métrica afeta o desempenho:

    Métrica Operações por pixel Custo relativo (1M pixels) Quando usar
    Euclidiana (L2) 2 subtrações, 2 multiplicações, 1 soma, 1 sqrt 🔴 Mais custosa – sqrt é cara Distância “real” no espaço contínuo
    City‑block (L1) 2 subtrações, 2 abs, 1 soma 🟡 Moderada – sem raiz quadrada Grids, robótica, imagens binárias
    Chessboard (L∞) 2 subtrações, 2 abs, 1 max 🟢 Mais eficiente Movimentos de peças, morfologia

    A função sqrt é computacionalmente mais cara que operações como adição, subtração, multiplicação e valor absoluto. Em CPUs modernas, a diferença pode ser pequena (cerca de 1,5× a 3×), mas em sistemas embarcados ou em laços de milhões de iterações, qualquer ganho importa. Por isso, quando o objetivo é apenas comparar distâncias (ex.: encontrar o ponto mais próximo), use a distância euclidiana ao quadrado.


    📋 Tarefa (especificação para VPL)

    Entrada:
    Uma única linha com quatro números reais: Ax Ay Bx By

    Saída:
    Três linhas, cada uma com um número real de duas casas decimais (Euclidiana, City‑block, Chessboard).


    📌 Exemplos

    Entrada Saída Observação
    0
    0
    3
    4
    5.00
    7.00
    4.00
    Triângulo 3‑4‑5
    0
    0
    1
    1
    1.41
    2.00
    1.00
    Diagonal unitária

    Exemplo de teste de sqrt em Python, com timeit isolando cada operação:

    🎮 Simulador: arraste os pontos ou use os controles ⚡ Euclidiana (√) ≈ mais custosa
    📐 Euclidiana (L2)
    5.00
    √(Δx²+Δy²)
    🧱 City‑Block (L1)
    7.00
    |Δx|+|Δy|
    🏁 Chessboard (L∞)
    4.00
    max(|Δx|,|Δy|)
    👆 clique e arraste os pontos A (roxo) ou B (laranja)
    Ponto A
    Ponto B
    💡 O gráfico mostra: linha reta tracejada (Euclidiana), caminho em L (City‑Block) e o lado máximo contínuo (Chessboard).
    Euclidiana City‑Block Chessboard (max)

    🐍 Python

    Basta criar uma célula de código normal e inserir o código Python. A entrada pode ser simulada usando input(), que funciona normalmente.

    Exemplo de célula: