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:
| 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)
💡 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: